(function(){
var x = 23;
return function(){
var x = x;
return x;
}
}())();
为什么它返回undefined而不是23?
不应该是var x = x;部分是否足够明确,因为右侧隐含地引用了外部范围中的x?
答案 0 :(得分:2)
声明var x = x;
没有看到外部作用域中的变量x
。范围内的变量x
在赋值之前已经存在,并且从外部范围隐藏变量。
范围内的所有变量都是在范围内的代码执行(提升)之前创建的,因此它与您拥有的相同:
(function(){
var x;
x = 23;
return function(){
var x;
x = x;
return x;
}
}())();
在声明变量的范围内,实际上并不重要。你可以在代码中最后声明它们(虽然这会有点令人困惑),代码仍然有效:
(function(){
x = 23;
return function(){
x = x;
return x;
var x;
}
var x;
}())();
答案 1 :(得分:1)
var x = x不应该;部分是否足够明确,因为右侧隐含地引用了外部范围中的x?
没有。在执行任何分配之前确定变量的所有范围。
答案 2 :(得分:0)
有一个名为变量提升的概念..简而言之,就在执行函数之前,所有在函数内声明的变量都将被标记为undefined。因此它返回undefined ..由于变量提升,您可以稍后定义变量,但可以在之前使用它...例如。 function(){alert(x);var x;}
将警告未定义,但function(){alert(x);}
会在哪里引发错误..
答案 3 :(得分:0)
假设:
(function(){
var x = 23;
return function(){
var x = x;
return x;
}
}())();
内部函数只能看到内部 x 。
当输入执行上下文时,所有声明的变量都会被初始化,给定值 undefined 并在执行任何代码之前放置在一种变量对象上(例如赋值)。所有外部变量都放在范围链上。
在解析标识符时,首先检查变量对象,并且只有在未找到的情况下才会检查范围链。