另外,可以看看这篇文章:https://www.cnblogs.com/pengshengguang/p/11105323.html
this对象是在运行时基于函数的执行环境绑定的:
-
在全局函数中,this—>window
-
在函数中
1、作为对象的方法来调用 this—>当前的对象
2、作为普通的函数调用 this—>window
(1.2可总结为 看函数名前面是否有“.” ,有的话, “.”前面是谁,this就是谁;没有的话this就是window )
3、作为构造函数和new使用 this—>构造函数内部新创建的对象
4、被call或者是apply调用(函数上下文调用) this—>第一个参数
5、立即执行函数中的this永远都是window
6、箭头函数不绑定this,会捕获其所在的上下文的this值,作为自己的this值。通过 call() 或 apply() 方法调用一个函数时,只传入了一个参数,对 this 并没有影响
(function() { return [ (() => this.x).bind({ x: 'inner' })() ]; })() // undefined (function() { return [ (() => this.x).bind({ x: 'inner' })() ]; }).call({ x: 'outer' }); // ['outer']
一道this面试题
var num = 20;
var obj = {
num: 30,
fn: (function(num) {
this.num *= 3;
num += 15;
var num = 45;
return function() {
this.num *= 4;
num += 20;
console.log(num);
}
})(num)
};
var fn = obj.fn;
fn(); // ->65
obj.fn(); // ->85
console.log(window.num, obj.num) // ->240, 120
// 1、fn();
// 因为立即执行函数中的this永远是window,所以 this.num = 20*3 = 60, num到上一个作用域找到是45
// 输出num 45+20=65 window.num = 60*40 = 240 obj.num = 30
// 2、obj.fn();
// this指向obj,所以这里面 this.num = 30,num = 65
// 输出num 65+20=85 window.num = 240 obj.num = 30*4 = 120