JavaScript中this指向问题

在严格模式下,全局作用域的函数中,this默认指向 undefined, 这是严格模式所规定的。

// 非严格模式下

console.log(this); // Window

function doSomething(){

    console.log(this); // Window

}

doSomething(); // 这里可以看成window.doSomething(),所以函数里的this指向全局对象window

// 严格模式下

'use strict';

console.log(this); // Window

function doInStrict(){

    console.log(this); // undefined

}

doInStrict();

对象里的函数,this指向该对象

var a = 1;

var obj = {

    a: 2,

    fn: function(){

        console.log(this); // {a: 2, fn: ƒ}

        console.log(this.a); // 2

    }

};

obj.fn();

上面函数被调用后,从打印结果可以看出此时 this 指向的是调用函数的对象 obj。如果将对象中的函数赋给全局对象中定义的变量 fn1,执行 fn1 又会出现什么结果呢?

var a = 1;

var obj = {

    a: 2,

    fn: function(){

        console.log(this); // Winidow

        console.log(this.a); // 1

    }

};

var fn1 = obj.fn;

fn1(); // 可以看成window.fn1();

从上面的例子可以看出,fn1 与 obj.fn 指向的函数是相同的,但是调用它的对象不同,那么函数中 this 的指向也就不一样了。

再看一个比较复杂的例子:

var a = 0;

function fn(){

consoloe.log(this.a);

}

var obj1 = {

a: 1,

fn: function(){

console.log(this.a);

}

};

var obj2 = {

a: 2,

fn: function(){

fn();

obj1.fn();

console.log(this.a);

}

}

obj2.fn();

先说下执行结果,分别打印 0 1 2。当 obj2 调用 fn 函数时,先执行的是 fn(),这个函数是在全局作用域中定义的,该调用可以看成 window.fn(),所以,该函数内部的 this 指向的是 window 全局对象,this.a 自然就是全局对象中的 a 值(0)。

接着执行的是 obj1.fn(),它会从 obj1 中找到 fn 函数并执行。obj1 中的函数 fn 执行时调用它的对象是 obj1,所以,此时函数内部的 this 指向的就是 obj1 自身。那么 this.a 查到的值也就是对象 obj1 中 a 的值(1)。

最后打印函数中 this 所处的函数 fn 是被 obj2 调用的,那么自然而然 this 就指向了 obj2,所以 this.a 的结果就是 2 了。

从上面这个例子我们可以看出:函数内部 this 指向跟调用函数的对象有关,跟函数在哪里调用没有关系。

Window内置函数的回调函数中,this指向Window对象。

window 的内置函数( setInterval setTimeout 等),其回调函数中的 this 指向的是window对象。

var name = 'window';

var obj = {

    name: 'obj',

    func: function(){

        setTimeout(function () {

            console.log(this.name) // window

        },1000)

    }

}

obj.func()

亚马逊测评 www.yisuping.com

你可能感兴趣的:(JavaScript中this指向问题)