this指向
# this指向
# use strict
非严格模式会自动指向全局,严格模式下无调用者指向 undefined
# window 调用
在全局执行上下文(在任何函数体外部)中,this指向全局对象。在浏览器环境中,this指向window对象;而在 Node.js 环境中,this指向global对象。 win 是 foo 的调用者,this 指向 win
var a = 20
function foo() {
var a = 1
var obj = {
a: 10,
c: this.a + 20,
fn: function () {
return this.a
},
}
return obj.c
}
console.log(foo()) // 40
console.log(window.foo()) // 40
# 对象属性 调用
obj 是 foo 的调用者,this 指向 obj win 是 test 的调用者,this 指向 win
var a = 20
var obj = {
a: 10,
foo: function () {
return this.a
},
}
console.log(foo.getA()) // 10
var test = foo.getA
console.log(test()) // 20
# 独立 调用
这里 obj.foo 只做指传递,并没有调用,最后调用者还是 fn >>> active >>> win
# 显式绑定
使用.call()、.apply()、或.bind()方法可以显式地设置this的值。
let obj = { a: 1 }
foo.call(obj, 1, 2, 3)
foo.apply(obj, [1, 2, 3])
let newFoo = foo.bind(obj, 1, 2, 3)
newFoo()
this 指向 call 第一个参数
let obj = {
a: 1,
}
var a = 2
function foo() {
console.log('>>>', this.a)
}
let bar = function () {
foo.call(obj)
}
bar() //1
setTimeout(() => {
foo.call(obj) //1
bar() //1
}, 1000)
# 构造函数调用
使用new关键字调用函数时,this指向新创建的对象。
function Constructor() {
console.log(this)
}
new Constructor() // `this`指向一个 Constructor 的新实例
# 箭头函数中的 this
箭头函数没有自己的this,它会捕获其所在上下文的this值作为自己的this值。
const obj = {
method: function () {
const arrowFunc = () => console.log(this)
arrowFunc()
},
}
obj.method() // 输出 obj
在上述例子中,arrowFunc箭头函数捕获了method方法中this(即obj对象)作为自己的this值。
理解this在 JavaScript 中的行为对于编写可预测和健壮的代码至关重要。记住,this的值由调用上下文决定,而不是由定义上下文决定。掌握this的概念, 可以帮助开发者避免常见的编程错误,提高代码质量。