我读了Javascript Hoisting的概念.它让我感到很困惑,但是我看到了一些例子,并且知道吊装实际上是做什么的.
所以基本上" 提升是JavaScript将所有声明移动到当前范围顶部(到当前脚本或当前函数的顶部)的默认行为. "
但我无法理解以下实施:
var is_android = true;
if (is_android) {
function foo() {
alert('I am Android');
}
} else {
function foo() {
alert('I am NOT Android');
}
}
foo();
Run Code Online (Sandbox Code Playgroud)
输出在警告框中显示" 我不是Android ".
我想知道为什么foo()从else块调用,即使is_android值为true.
任何帮助将不胜感激.
嗨,大家好,我有一个简单的函数和一个全局变量.
为什么
mynameundefined不是字符串"global"?
var myname = "global"; // global variable
function func() {
alert(myname); // "undefined"
var myname = "local";
alert(myname); // "local"
}
func();
Run Code Online (Sandbox Code Playgroud)
是不是可以引用在该函数范围之外定义的外部变量?在这个全局变量......
我如何解决这个问题,以便undefined从全局变量中得到一个?
我有以下代码,我在其中声明一个函数,然后是一个与函数同名的变量:
function a(x) {
return x * 2;
}
var a;
alert(a);
Run Code Online (Sandbox Code Playgroud)
我希望这能提醒undefined,但如果我运行它,警报将显示以下内容:
函数a(x){
return x*2
}
如果我为变量赋值(如var a = 4),则警报将显示该值(4),但如果没有此更改,a则会将其识别为函数.
为什么会这样?
据我了解,IIFE模式是一个解决ES5及以下无法创建块范围的事实.通过将所有内容包装在函数中并立即调用它,我们可以创建一个范围.
现在,let并且const将获得更多浏览器的支持,这是否减少了对IIFE模式之类的需求?
我发现有几次我有一组相互关联的函数,我怎么自然地将它们放在文件中最终与它们的依赖项冲突(即函数1依赖于函数2,但是在函数1之上).当我编写代码时,我通常会继续评估顶级表达式,并且只会评估整个文件以刷新refs或诸如此类的依赖关系.我经常发现,我最终会遇到依赖冲突,并最终不得不兼顾一堆函数.
在其他语言中,我知道,只要你声明一个函数,它就会在幕后"悬挂",好像它出现在其他任何东西之前.这样您就不必担心代码中的事物顺序,并且可以将函数视为代码的模块化位.缺乏这个功能让我一直在咬我.难道我做错了什么?它是一个小麻烦然后是一个巨大的交易,这是你只是习惯于注意的东西?
在Chrome和Firefox中运行此功能会给出不同的答案:
(function() {
if(true) {
function f() { alert("yes"); };
} else {
function f() { alert("no"); };
}
f();
})();
Run Code Online (Sandbox Code Playgroud)
在Chrome中,结果是'不'在Firefox中,结果为'是'
为什么不同?
我有以下编辑代码:
module.exports = {
read: read,
write: write,
};
var read = function(parameters, config, next) {
/* <snip> */
};
var write = function(parameters, config, next) {
/* <snip> */
};
Run Code Online (Sandbox Code Playgroud)
如果我在require()别处转到此文件,它将崩溃节点并说所需的对象没有方法read或write.变量提升不会拉动上面的功能modules.export = { ... };吗?
function g () {
var x;
function y () {};
var z;
}
Run Code Online (Sandbox Code Playgroud)
我想知道上面的代码在提升时的确切顺序.
理论1:var s和functions 之间的顺序保持原样:
function g () {
var x;
function y () {};
var z;
}
Run Code Online (Sandbox Code Playgroud)
理论2: var先到functions:
function g () {
var x;
var z;
function y () {};
}
Run Code Online (Sandbox Code Playgroud)
理论3: function先到vars:
function g () {
function y () {};
var x;
var z;
}
Run Code Online (Sandbox Code Playgroud)
哪种理论是正确的?
我正在玩新的ECMASCRIPT-6 const关键词.我不明白关键字的一个特定行为.
可以说我有两个功能
第一个案例
(function(){
console.log(_t);
const _t=10;
})();
Run Code Online (Sandbox Code Playgroud)
和 第二个案例
function t(){
console.log(_y);
const _y=11;
}
t();
Run Code Online (Sandbox Code Playgroud)
对于第一种情况,输出是(不明白为什么)
ReferenceError:在初始化之前无法访问词法声明`_t'
对于第二种情况,输出是(罚款)
未定义
第二种情况输出是预期的,但我不知道为什么第一种情况结果会引发错误.可以从错误中推断出变量没有被提升.但为什么?我发现这里是const使用块范围.这个范围有什么关系吗?
我正在使用Firefox Developer Version控制台来运行测试.
我正在读"你不懂JS"系列的第二本书,我读过在变量之前函数被提升了.
所以这是代码:
foo(); // 1
var foo;
function foo() {
console.log( 1 );
}
foo = function() {
console.log( 2 );
};Run Code Online (Sandbox Code Playgroud)
这个输出将是1.但为什么呢?首先提升函数,然后提升变量.因此,在我的函数foo(打印1的那个)被提升之后,它必须跟随变量foo.所以结果应该是"未定义"而不是"1".
我希望代码的行为就像它一样:
// hoisted first
function foo() {
console.log( 1 );
}
// hoisted second
var foo; // implicitly initialized to 'undefined'
foo(); // call 'undefined' - error?
foo = function() {
console.log( 2 );
};
Run Code Online (Sandbox Code Playgroud)
这里发生了什么事?
hoisting ×10
javascript ×8
scope ×3
ecmascript-6 ×2
function ×2
clojure ×1
const ×1
firefox ×1
name-binding ×1
node.js ×1