this的指向问题

this的指向问题

              ——this指向直接调用它的对象

 

1.如果函数作为对象的一个属性时,并且作为对象的一个属性被调用时,函数中的this指向该对象。

var example = "window example";
var x = "window x";
var obj = {
    x: "obj x",
    fn: function () {
        var example = "obj example";
        alert(example);//object example
        alert(this);//object object
        alert(this.x);//object x
        return function () {
            alert(example);//obj example
            alert(this);//这个this指向window,object window
            alert(this.x);//window x
        }
    }
};
obj.fn();// object example
         // object object
         // object x
var f1 =obj.fn();
f1();    // object example
         // object object
         // object x
         // window example
         // object window
         // window x

 

这种情况下,如果obj.fn(),那么fn这个函数就是直接被obj调用的,它是obj的一个属性(方法), 它的this就指向obj。

但是,

 

obj.fn()()

 

也就是

 

var f1 =obj.fn();
f1();

 

是通过调用obj的方法fn的匿名函数。这中间多了一层,就不是直接调用了,这时候this就指向window

注意:找变量的时候是一层一层作用域往上找的,和this不同

 

个人理解:
由于函数作为对象的一个属性被调用时,函数中的this才指向该对象。

 

obj.fn()()

 

本身fn的匿名函数就不是obj的属性,它是obj的属性(方法)fn的匿名函数。 而且如果分开看,obj.fn()赋值给f1,f1在全局中,通过f1调用,也就是f1(), f1是个全局变量,所有在全局作用域中声明的变量、函数都会变成window对象的属性和方法。 那可以写为window.f1 既然在全局中调用,那么,this当然指向window

 

 

2.如果函数作为构造函数用,那么其中的this就代表它即将new出来的对象。

function A() {
this.name = '袁佳';
this.age = '1996';
}
var person = new A();
alert(person.name); //袁佳

 

 

3.普通函数在调用时,其中的this也都是window。

比如构造函数直接被调用,它的this就指向window

function A() {
this.name = '袁佳';
this.age = '1996';
alert(this);
}
A();//object window

 

 

这个构造函数实在全局作用域中声明的,是window对象的方法,相当于window.A()

4.apply和call情况

当一个函数被call和apply调用时,this的值就取传入的对象的值。

posted @ 2017-08-08 14:50  袁佳  阅读(197)  评论(0编辑  收藏  举报