this几种情况(必会)
- this执行主体,谁把它执行的「和在哪创建&在哪执行都没有必然的关系」
- 函数执行,看方法前面是否有“点”,没有“点”,this是window「严格模式下是undefined」,有“点”,“点”前面是谁this就是谁
- 自执行函数里面的this是在非严格模式下是window,严格模式下是undefined
- 给当前元素的某个事件行为绑定方法,当事件行为触发,方法中的this是当前元素本身「排除attachEvent」
- 构造函数体中的this是当前类的实例
- 箭头函数中没有执行主体,所用到的this都是其所处上下文中的this
- 可以基于Function.prototype上的call/apply/bind去改变this指向
一道题彻底理解函数中this指向和闭包作用域
前置知识点
x *= (++x) + y 相当于 x = x( (++x) + y)
首先是 var
var x = 3,
obj = {
x: 5
};
obj.fn = (function () {
this.x *= ++x;
return function (y) {
this.x *= (++x) + y;
console.log(x);
}
})();
var fn = obj.fn;
obj.fn(6);
fn(4);
console.log(obj.x, x, window.x);
答案是:13、234、95、234、234
然后换成let
let x = 3,
obj = {
x: 5
};
obj.fn = (function () {
this.x *= ++x;
return function (y) {
this.x *= (++x) + y;
console.log(x);
}
})();
var fn = obj.fn;
obj.fn(6);
fn(4);
console.log(obj.x, x, window.x);
答案是:5、6、55、6、NaN
重点原因
首先是var 和 let区别
var 声明的变量 会在window上挂在 let 不会;
所以let 声明的x window.x 是undefined
let x = 3;
// var x = 3
console.log(window.x); // undefined
(function () {
console.log(this.x);//undefined 这里this是window
console.log(x); // 3
this.x = ++x
console.log(this.x); //4 这里this是window
})()
console.log(window.x); // 4 此时window 多了个x = 4的属性
几道练习
var name="window";
function fn(){
console.log(this.name)
}
var obj={
name:"你好世界",
fn:fn
}
obj.fn(); //this是obj=>"你好世界"
fn();//this是window=>"window"
(function(){
this.fn(); //自执行函数里的this是window =>"window"
})();
let obj={
name:"li",
fn:(function(n){
// 这里的this window
console.log(this);
return function(){
// 这里的this=>obj
console.log(this);
}
})(10),
}
obj.fn();