Products
GG网络技术分享 2025-03-18 16:13 86
JavaScript中this
JavaScript中如何理解this始终指向最后调用它的那个对象。
ES5中,this的指向始终坚持一个原则,就是永远指向最后调用它的那个对象。
重要的事说三遍
指向最后调用它的那个对象
指向最后调用它的那个对象
指向最后调用它的那个对象
看几个demo就会理解了:
happy
inner:[object Window]
outer:[object Window]
this指向最后调用它的那个对象,之后调用supper的地方是supper(),相当于window.supper();inner中的this指向window,this.name肯定是happy了;
sad
obj.supper(),调用者是obj,而obj.name是sad,所以说this.name是sad没问题
sad
虽然这个调用加上了window,但是最后调用者仍然是obj,而obj.name是sad,所以说super中的this.name是sad没问题
undefined
super的最后调用者是obj,所以super中的this肯定是指向obj的,而obj中的name没有定义,所以说为undefined
happy
虽然将obj.supper赋值给了f,但是仅仅是赋值,没有调用,而f()是被window调用的,所以说super中的this指向window,this.nane是happy
happy
最后调用innerFunction的是window,所以this是happy;
MDN的官方解释:与其他语言相比,函数的 this 关键字在 JavaScript 中的表现略有不同,此外,在严格模式和非严格模式之间也会有一些差别。在绝大多数情况下,函数的调用方式决定了this的值。this不能在执行期间被赋值,并且在每次函数被调用时this的值也可能会不同。
简而言之:
1.this指向的对象称为函数的上下文对象context;
2.this的指向取决于函数被调用方式
不管函数怎么调用的天花乱坠,我们只要记住这几点即可清晰的找出this的指向。
2、小实验
| function foo(){ console.log(this); } |
面试官问你this指向哪里,当然大声回答不知道,原因:谁调用指向谁,函数都没被调用,确实不知道指向。
hanMeiMei.buyPan.apply(liLei)(); //liLei have money:8
小结:三种方法的相同指出是:可以改变this的指向,不同之处是:apply接受的参数为一个数组,call接收的参数为一个个独立的值;apply,call会直接调用方法,bind改变this的指向返回一个方法不调用。
Demand feedback