2014-10-10 124 views
2

JavaScript指南中有一个关于变量范围的语句:“JavaScript中的变量在某种意义上被”悬挂“或被提升到函数或语句的顶部,但变量不是初始化还会返回一个未定义的值。“JavaScript变量范围返回“未定义”

/** 
    * Example 2 
    */ 
    // will return a value of undefined 
    var myvar = "my value"; 

(function() { 
    console.log(myvar); // undefined 
    var myvar = "local value"; 
})(); 

我的问题是:为什么“console.log(myvar);”会返回undefined?我认为第一行已经初始化了myvar这个值是“我的价值”。

+1

你的代码示例具有相同名称的两个变量,一个本地的函数初始化MYVAR之前,那是被记录的一个。 – nnnnnn 2014-10-10 02:52:45

+0

忘记术语“提升”,这是一个分心。在执行任何代码之前处理变量和函数声明。 **然而**,初始化在执行过程中发生。因此,尽管变量从一开始就存在,但在赋值执行之前它不会被赋值。 – RobG 2014-10-10 03:05:47

回答

4

因为所有变量声明将自动提升至其定义功能块的顶部,这样的代码:

(function() { 
    console.log(myvar); // undefined 
    var myvar = "local value"; 
})(); 

其实这是JS的解释:

(function() { 
    var myvar; // declares a new local variable that covers up the global name 
    console.log(myvar); // undefined 
    myvar = "local value"; 
})(); 

这应该告诉你为什么本地定义的myvarconsole.log()输出的内容,它已被定义,但尚未初始化,因此它显示为undefined

的本地定义myvar重写/覆盖了全局定义的一个,所以当你在你的函数访问myvar,你只能获得局部定义变量(不管是尚未还是未初始化)。

查看同一主题的其他一些参考:

How do JavaScript variables work?

JavaScript variable undefined vs not defined

One var per function in JavaScript?

JavaScript 'hoisting'


如果哟你删除你的函数中的var(所以你只是引用一个变量,而不是声明一个新变量),那么你将只有一个全局变量名为myvar,你会得到它看起来像你可能会期待的行为:

var myvar = "my value"; 

(function() { 
    console.log(myvar); // outputs "my value" 
    myvar = "local value"; 
})(); 
+0

请注意,OP令人困惑,因为她的示例具有两个相同名称的变量:该问题明确提到将值分配给全局变量。 – nnnnnn 2014-10-10 02:57:28

+0

@nnnnnn - 是的,我已经解决了一些编辑。 – jfriend00 2014-10-10 02:57:50

+0

在ES5中,[*变量在创建时被初始化为'undefined'](http://ecma-international.org/ecma-262/5.1/#sec-12.2),所以它们的值总是被定义的,它们本质上是“初始化”两次。 ;-) – RobG 2014-10-10 03:09:01

2

这里你的功能是一个自我调用功能。自调用表达式会自动调用(启动),而不会被调用。提升适用于变量声明和函数声明。

var myvar = "my value"; 

(function() { 
    console.log(myvar); // undefined 
    var myvar = "local value"; 
})(); 

所以这里的功能调用它自身甚至与指定的值

+0

全局变量在函数被调用之前被初始化。但是,未定义的值被记录属于同名的局部变量,局部变量的初始化不受函数调用方式的影响。涉及立即调用的函数表达式的事实是不相关的。 – nnnnnn 2016-03-27 10:32:18