javascript中的this指向问题

关于在javascript中的this指

阅读量:1140

点赞量:0

评论量:0
Skill
标签
标签: Javascript
摘要
关于在javascript中的this指向问题及相关说明。
正文

结论

先说结论:在不使用箭头函数和修改this指向时,this默认指向最终调用它的对象。

例子

function a() {
    console.log(this);
}
a();        // window对象
上面的代码相当于:
function a() {
    console.log(this);
}
window.a();        // window对象

this的执行,是由window对象的a方法调用的,所以this指向window

var a = {
    'print': function () {
        console.log(this);
    }
}
a.print();        // a对象
window.a.print();        // a对象

this是由a对象的print方法调用的,a对象虽然属于window对象,但this指向最终调用它的对象,所以this指向a。

var a = {
    'b': {
        'print': function() {
            console.log(this);
        }
    }
}
a.b.print();        // b对象

这个就不说了。

function b() {
    console.log(this);
}
var a = {
    print: function () {
        b();        // 此处相当于window.b();
    },
    print1: function () {
        return b;
    }
}
a.print();        // window对象
a.print1()();    // window对象

这个例子中,a对象只是调用的print方法,最终调用this的是window对象的b方法。

function b() {
    console.log(this);
}
var a = {
    'print': b
}
a.print();        // a对象

这个例子中,将b方法给了a对象的print方法,所以this是由a.print方法调用的。

可以看成下面的例子:

var a = {
    'print': function b() {
        console.log(this);
    }
}
a.print();        // a对象

这样就比较好理解了。

var a = {
    'print': function () {
        console.log(this);
    }
}
var b = a.print;
b();            // window对象

a.print只是一个函数,这个函数赋给b,再由b执行,而b属于window对象,最终调用this的就成window对象了。

自执行函数的this指向问题

var a = {
    'print': function() {
        console.log(this);        // a对象
        (function () {
            console.log(this);    // window对象
        }()) ;
    }
}
a.print();

在自执行函数中this指向window对象。

定时器函数this指向

var a = {
    'print': function () {
        setTimeout(function() {
            console.log(this);
        }, 500);
    }
}
a.print();        // window对象

setTimeout & setInterval 中,延后执行的内容,this指向window。

new关键字this指向

function A() {
    this.print = function () {
        console.log(this);
    }
}
var a = new A();
a.print();        // a对象

new关键字会创建一个空的对象,然后会自动调用一个函数call方法,将this指向这个空对象,这样的话函数内部的this就会被这个空的对象替代。

通过new关键字创建的对象,若构造函数有返回值,且返回值为对象,则创建的对象为返回值,返回值不为对象,创建的对象为构造的对象,更多请看new关键字


严格模式中默认this不在指向window,而是undefined。


想要改变this指向:bind&call&apply

发布于: 9/1/2022, 4:02:03 PM
最后更新: 12/3/2024, 3:32:03 AM