关于javascript范围问题。为什么结果是不确定的

时间:2016-05-13 12:04:46

标签: javascript

我想知道为什么警告x是一个' unifined',为什么不是10。

var x = 10;
function foo(){
    alert("foo---" + x);
};
(function(){
   alert("this === window---" + (this === window));
   alert("window.x---" + window.x);
   alert("this.x---" + this.x)
   alert("x---" + x); //undifined ? why
   var x = 20;
   foo.call(); //10
})();

2 个答案:

答案 0 :(得分:0)

var x = 10;
function foo(){
    alert("foo---" + x);
};
(function(){
   alert("this === window---" + (this === window));
   alert("window.x---" + window.x);
   alert("this.x---" + this.x)
   alert("x---" + x); //undifined ? why
  // var x = 20; // Comment this variable 
   foo.call(); //10
})();

当你定义变量名x并指定一些值时,这个函数就是调用,而在你定义的所有其他警告中,就像窗口一样,但是当你只提供x时,那么在jquery中它将无法提供你想要的哪个x警告 在jquery window.x中,第一个x值在第一个函数“foo”中相同,但在第二个函数中,x在alert之后定义,因此alert是未定义的

如果你在x上发出警报,那么它会给出undefined,因为你也在该函数的警告后定义了相同的变量

答案 1 :(得分:0)

这是因为javascript的一个名为变量提升link的功能。

因此,当解释器解释您的代码时,这会在运行时发生。

var x = 10;
function foo(){
 alert("foo---" + x);
};
(function(){
  var x;
  alert("this === window---" + (this === window));
  alert("window.x---" + window.x);
  alert("this.x---" + this.x)
  alert("x---" + x); //undifined ? why
  x = 20;
  foo.call(); //10
 })();

从上面可以看出,变量声明var x被移到顶部,离开了作业。因此,当您调用alert("x---" + x)时,尚未定义变量x。