this的指向问题

发布于 2015-08-25

引言:javascript的this关键字是个非常让人头疼的部分,this的指向真是让人“出乎意料”。看了《javascript高级程序设计》中的关于this对象的描述,差不多有了一个清晰的认识,为了防止忘记和分享所以做此总结。

this在不同情况下的指向

###全局环境中的this

    alert(this);  //window

在全局环境中this指向全局对象,在浏览器中自然就指向Window。

全局环境中函数调用

var name="Window";
function object(){
    var name = "Object";
    console.log(this.name);
}
object();   //Window

这里this指向了全局对象,即Window。在这个例子中即使object函数内部也定义了name属性,但是javascript中遵循谁调用了函数,那么这个this就指向谁。在严格模式中,则是undefined。

作为对象的方法调用函数

var name = "Window";
var o = {
    name : "object",
    sayName : function(){
        console.log(this.name);
    }
}
o.sayName();  //object

这次this指向的是定义的对象o,即当前对象。正好印证了谁调用指向谁的规律。

作为构造函数

new Person();

函数内部的this指向新创建的对象。

闭包内部函数

var name = "Window";
var o = {
    name : "Object",
    sayName : function(){
        return function(){
            return this.name;
        }
    }
}
console.log(o.sayName()());  //Window

存在闭包的情况下,函数的this指向与上面单纯的对象的函数的this指向又不太一样。这是为什么呢?通过参考《javascript高级程序设计》中的讲解加上我自己的理解,我的解释是这样的:闭包其实返回的就是一个匿名函数,而匿名函数的执行环境具有全局性,因此其this对象通常指向window。而又根据函数的执行环境,每次搜索变量时,只搜索到其活动对象为止(此活动对象为window),所以就无法访问其外部函数的变量了。
那么如果想访问到外部作用域中的this,就需要将外部作用域中的this对象保存在闭包可以访问到的变量里。

var name = "Window";
var o = {
    name : "Object",
    sayName : function(){
        var that = this;  //注意这里
        return function(){
            return that.name;
        }
    }
}
console.log(o.sayName()());  //Object

使用call和apply

call( thisArg [,arg1,arg2,… ] ); //参数列表,arg1,arg2,...
apply(thisArg [,argArray] );    // 参数数组,argArray

两者都是将某个函数绑定到某个具体对象上使用,自然此时的this会被显式的设置为第一个参数。
因本人还是个菜鸟,以上描述如有错误请评论指出…


Copyright © 2015-2025 万趣岛 | 网站地图 | 隐私政策 | RSS | 豫ICP备2022016638号-1