函数中的this

JavaScript高级程序设计(P114):(函数中的)this引用的是函数据以执行的环境对象。按照书上的说法,匿名函数的执行环境是a函数,所以匿名函数里的this应该是a,为什么是window?

function a(){
    var h=0;
    (function(){
        var h=9
        console.log(this)
    })()
}
a()
阅读 3.3k
5 个回答

this的指向是当前函数的调用者。

因此在new,call或者apply之前,所有functionthis都指向window
new方法实际创建了一个新的调用环境。

function a(){
    //这是私有变量,外部无法看见
    var h = 0;
    //使用this才允许外部访问
    this._h = h;

    //这种匿名函数无法访问
    (function(){
        console.log(this)
    })();
    
    //改写为命名函数并用this暴露
    function _fun(){
        console.log(this)
    };

    this.func = _fun;
}

//使用new创建一个新的调用环境
var c = new a(); 

//此时就能看到正确的this指向了
c._h; // 0 

c.func(); // a {_h: 0}

除了自执行函数,还有setTimeout

执行环境指的是函数执行时的调用者,比如:

var arr = [1,2,3];
arr.reverse();//arr是执行环境
var arr2 = {"0":"a","1":"b","2":"c","length":3};
[].push.call(arr2, 'x');//arr2是执行环境
[].push.apply(arr2, ['y']);//arr2是执行环境
alert('Hello World');//window是执行环境
(function(){console.log(this)})();//这个匿名函数的执行环境是window

所以你的this是window。

函数的AO对象不能被引用,只有全局的VO对象能被直接引用。相当于a.AO > null >隐式转化为window。匿名函数直接转为null > 隐式转为window.建议看下这篇文章。可以解决this的问题 http://dmitrysoshnikov.com/ec...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题