JavaScript如何提升变量?

时间:2013-05-03 23:58:37

标签: javascript scope

我知道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

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设置为NaNundefined + 1 === NaN

a属于该函数的范围,因此,当您调用它时,a的值已为3

答案 2 :(得分:2)

JavaScript范围

我希望使用我目前所知的最正确的术语,我也知道它不完全正确。我不是任何javascript专家,但你要问的问题与 JavaScript范围有关。你可以找到很多关于这个主题的文章,也可以找到关于SO的一些Q& A like this one i found with examples

一步一步

我会尝试逐行重现你的snipnet是什么。如果你在某个地方注意到错误的术语,请发表评论,我喜欢随时学习:D

第1行

var doB = function() { return a+1};

装置

  

在当前范围内存储名为“doB”的变量,将其内容分配给匿名函数。

所以...

a目前无关紧要。


第2行

var b = a+1;

装置

  

在当前范围内存储名为b的变量,除变量new Integer(1)外,还将其内容分配给a

所以...

此时aundefined,因为它未在当前范围内声明,也不能从此范围访问其他范围。操作undefined + a等于NaNa被指定为NaN作为值。


第3行

var a = 3;

装置

  

在当前范围内存储名为a的变量,将其内容分配给new Integer(3)

所以...

现在我们有一个存储整数的变量a


第4行

console.log(b);

输出NaN,因为b实际上是NaN


第5行

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}}