我知道JavaScript会将所有变量声明移动到函数的顶部。但是,我在下面的console.log()中期望得到相同的结果。但是,我在第一种情况下得到NaN,在第二种情况下得到4。
有人可以解释一下吗?我知道在StackOverflow上已经有类似的问题已经问过并回答了,但是这个问题与函数定义有关。例如,JavaScript是否将函数变量移动到变量声明的末尾?
var doB = function() { return a+1};
var b = a+1;
var a = 3;
console.log(b); // NaN
console.log(doB()); // 4
答案 0 :(得分:5)
由于提升,这就是您的代码在技术上的样子:
var doB, b, a;
doB = function() {
return a+1;
};
b = a + 1;
a = 3;
console.log(b); // NaN
console.log(doB()); // 4
由于代码是从上到下执行的,当b
初始化为a + 1
时,a
尚未初始化为任何内容(undefined
)。实际上,b
尝试设置为undefined + 1
,即NaN
答案 1 :(得分:2)
变量被提升后,您的代码基本上就像这样:
var doB;
var a;
var b;
doB = function() {
return a + 1
};
b = a + 1;
a = 3;
console.log(b); // NaN
console.log(doB()); // 4
由于在您定义a
时尚未定义b
,因此b
设置为NaN
,undefined + 1 === NaN
。
a
属于该函数的范围,因此,当您调用它时,a
的值已为3
。
答案 2 :(得分:2)
我希望使用我目前所知的最正确的术语,我也知道它不完全正确。我不是任何javascript专家,但你要问的问题与 JavaScript范围有关。你可以找到很多关于这个主题的文章,也可以找到关于SO的一些Q& A like this one i found with examples
我会尝试逐行重现你的snipnet是什么。如果你在某个地方注意到错误的术语,请发表评论,我喜欢随时学习:D
var doB = function() { return a+1};
在当前范围内存储名为“doB”的变量,将其内容分配给匿名函数。
a
目前无关紧要。
var b = a+1;
在当前范围内存储名为
b
的变量,除变量new Integer(1)
外,还将其内容分配给a
。
此时a
为undefined
,因为它未在当前范围内声明,也不能从此范围访问其他范围。操作undefined + a
等于NaN
。 a
被指定为NaN
作为值。
var a = 3;
在当前范围内存储名为
a
的变量,将其内容分配给new Integer(3)
现在我们有一个存储整数的变量a
。
console.log(b);
输出NaN
,因为b
实际上是NaN
。
console.log( doB() );
使用通过调用函数
console.log
而不带参数作为第一个参数返回的值来调用函数doB
。
doB
被调用并返回:
一个+ 1
new Integer(1)
除了变量a
之外。函数本地作用域中不存在a
,但它存在于函数内可访问的作用域中。该值取自那里,实际上是3
。控制台输出4
。
答案 3 :(得分:0)
a
分配给1
时尝试向其添加b
时, var b = undefined+1; // = NaN
未定义。
{{1}}