在不使用闭包的情况下
- this指向的调用该函数的对象
var name = "小刚";
var obj = {
name:"小明",
fn:function () {
console.log(this.name,this);
}
}
obj.fn() // 小明 obj
闭包函数中this的指向
- 在使用了闭包的情况下,this会丢失自己原本的指向
- 下面的例子中this 实际上是指向的window
var name = "小刚";
var obj = {
name:"小明",
fn:function () {
return function () {
console.log(this.name);
}
}
}
obj.fn()() // 小刚 window
如何修改闭包函数中 this 的指向
1. 使用一个变量保存 当前 this(简单易懂的方法)
var name = "小刚";
var obj = {
name:"小明",
fn:function () {
var that = this ;
return function () {
console.log(that.name);
}
}
}
obj.fn()() // 小明
2. 使用 call 或 apply方法
var obj = {
name: "小明",
fn: function() {
var foo = function() {
console.log(this.name);
}
foo.call(this)
return foo
}
}
obj.fn()() // 小明
3. 使用 bind 方法
var obj = {
name: "小明",
fn: function() {
return function() {
console.log(this.name);
}.bind(this)
}
}
obj.fn()() // 小明
4. 使用ES6的箭头函数
- 箭头函数中的this完全使用了一套新的规则
var obj = {
name: "小明",
fn: function() {
return () => {
console.log(this.name)
}
}
}
obj.fn()() // 小明