理解JavaScript中的this

Posted LazyChen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解JavaScript中的this相关的知识,希望对你有一定的参考价值。

javascript中,this关键字是用来引用 调用该函数的 那个对象的。看几个栗子:

var name="Window";
var obj={
    name:"Object",
    funObj:function(){
            console.log(this.name);
    }  
};
//
var funObjCopy=obj.funObj;
function a(){
    console.log(this.name);
}
obj.aCopy=a;

//Object
obj.funObj();
//Window
funObjCopy();
//Window
a();
//Object
obj.aCopy();

从上面的例子可以看出,this引用的是 调用该函数时“.”前面的那个对象(如 obj.funObj()、obj.aCopy() );如果没有通过“.”的方式而是直接调用,那么this引用的就是全局对象,换句话说,如果这个对象是一个函数调用对象或者全局对象,那么将得到对全局对象的引用;

接下来是个在嵌套函数中使用this的栗子:

var name="Window";
function test(){
    var name="test01";
    console.log(name);
    console.log(this.name);
    function funF(){
        var name="test02";
        console.log(name);
        console.log(this.name);
    }
    funF();
}

//test01 Window  test02 Window
test();

注意funF函数中打印this.name得到的依然是Window;再来看一个类似例子:

var name="Window";
var obj={
    name:"Object",
    funObj:function(){
        var name="Function";
        function funF(){
            return this;
        }
        console.log(name);
        console.log(this.name);
        console.log(funF().name);
    }
};

//Function  Object  Window
obj.funObj();

注意这个例子中funF函数返回的是window对象,所以打印的结果依然是Window;由此我们可以得出:在方法内嵌套的函数中使用this,仍然会得到对全局对象的引用(除了通过“.”方式调用的)。

突然想到了call()和apply()方法,顺便记一下了

每个函数都包含两个非继承而来的方法:call()和apply();这两个方法的作用是一样的,都是为了在特定的作用域中调用函数,换句话说其实就是设置函数体内this对象的值。区别就在于apply()只接受两个参数,第一个和call()一样,都是指定this对象的值,另一个是必须是参数数组(可以是Array的实例,也可以是arguments对象);而call()方法的参数则必须逐个列举出来,将就第一个例子来看看:

var name="Window";
var obj={
    name:"Object",
    funObj:function(){
        var name="Function";
        console.log(this.name);
    }
};
function a(){
    console.log(this.name);
}

//Window
a();
//Object
a.call(obj);
//Object
a.bind(obj);

 

以上是关于理解JavaScript中的this的主要内容,如果未能解决你的问题,请参考以下文章

全面理解JavaScript中的 this

对JavaScript中this的理解

精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解

理解JavaScript里this关键字

如何理解 JavaScript 中的 this 关键字

拾遗理解Javascript中的Arguments