2012-11-02 65 views
3
var x = 3; 
(function(){ 
    console.log('before', x); 
    var x = 7; 
    console.log('after', x); 
    return ; 
})(); 

在上面的代码中,var X是全局初始化的。所以在函数内部,第一个console.log应该打印“3之前”,但我不明白。原因是我想重新声明全局变量。由于全球范围变量导致的javascript错误

有人可以解释为什么会发生这种情况吗?

+1

链接回答你的问题:http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting FWIW,你正在寻找“提升”。 –

回答

3

解析你的代码时,JavaScript分析器不Variable Hoisting。这意味着,任何变量的声明会在你的情况下被移动到当前范围的顶部,因此,这段代码将得到执行:

var x = 3; 
(function(){ 
    var x; 
    console.log('before', x); 
    x = 7; 
    console.log('after', x); 
    return ; 
})(); 

所以你的局部变量x被宣布在第一次使用的undefined初始值。

这应该解释一下,为什么你会得到一个“beforeundefined”第console.log()

5

在上面的代码变种X全局初始化。所以在函数内部,第一个console.log应该在“之前3”打印。

不,应该打印before undefined,因为var需要从功能的开始,无论你写它的效果。

你的代码是正是与此相同:

var x = 3; 
(function(){ 
var x; 

console.log('before', x); 
x = 7; 
console.log('after', x); 
return ; 
})(); 

和当然,变数开始值undefined

详情:Poor misunderstood var

+0

但是如果是这种情况,那么它应该显示在7 ...之前? – harikrish

+1

@harikrish只是声明移到顶端,而不是任务! – Sirko

+0

哇,没有意识到这一点!现在将重构一些代码! – clentfort

1

变量的范围比其他语言要简单得多。它不会在声明开始,但有两种情况:

  • 中,你必须声明的功能
  • 全球范围内,如果该声明不是在一个函数

MDN

用var声明的变量范围是包含函数 ,或者对于在函数外声明的变量,全局范围(其中 被绑定到全局对象)。

你可以想象所有的变量声明都被移到了作用域(函数)的开始处。因此,这是完全一样

var x = 3; 
(function(){ 
    var x; 
    console.log('before', x); // now undefined 
    x = 7; 
    console.log('after', x); // now 7 
    return ; 
})(); 

要认真了解什么是确切范围(函数,而不是块):

var x = 3; 
(function(){ 
    console.log('before', x); // this is undefined ! 
    if (true) { 
     var x = 7; 
    } 
    return ; 
})();