关于js作用域及执行环境的问题

            window.onload = function(){
            var  b = 1;
            alert(this);
            Test();
            }
    function Test(){
         alert(this);
        alert(b);
    }
    

test方法在onload事件函数里执行,那这方法应该是在onload事件函数的作用域内,同时我打印onload事件的指向与test方法的指向,都是window,不明白为什么方法Test获取不到变量b,往前辈们指点下,谢谢。

阅读 2.8k
6 个回答
  1. var 声明 b 和调用 b 是在两个独立的代码块内
    独立的代码块内声明的变量不能互相调用。

  2. this 指向是调用体所决定的。
    调用时是 Test() 这种形式,这和 Test() 在哪写的无关。
    你甚至可以将 Test() 理解为 window.Test() ,里面的 this 指向为 window

函数作用域是在声明时决定的,而不是运行时决定。
因为onload事件函数和test函数平级,自然找不到onload函数中的b咯

因为变量b是在onload函数作用域下,并非在window作用域。而Test在全局作用域下声明的,不是在onload函数体内声明的,变量b也不会按闭包方式传入Test函数。

window.onload = function(){
     var b = 1; 
     console.log(this.b)    // undefined 发现没,window下并没有变量b
     Test();
}

window.onload = function(){
     this.b = 1;   
     console.log(this.b);    // 1
     Test();
}
// alert 1

上下文环境和作用域关系在声明时确定,与在哪里调用无关。

推荐问题