一、面试题
function foo () {
console.log(this)
}
foo() // => 全局对象
foo.call(123) // => 123
二、面试题
const obj1 = {
foo: function () {
console.log(this)
}
}
// obj1.foo() // => obj1
const fn = obj1.foo
fn()
三、面试题
const obj2 = {
foo: function () {
console.log(this) // this => obj2
const bar = function() {
console.log(this)
}
bar()
}
}
obj2.foo()
- this 指向 取决于调用,而非定义
- 调用指的是所在函数的调用
关于 this 的总结:
-
沿着作用域向上找最近的一个 function(不是箭头函数),看这个 function 最终是怎样执行的;
-
this 的指向取决于所属 function 的调用方式,而不是定义;
-
function 调用一般分为以下几种情况:
- 作为函数调用,即:
foo()
- 指向全局对象(globalThis),注意严格模式问题,严格模式下是 undefined
- 作为方法调用,即:
foo.bar()
/foo.bar.baz()
/foo['bar']
/foo[0]()
- 指向最终调用这个方法的对象
- 作为构造函数调用,即:
new Foo()
- 指向一个新对象
Foo {}
- 指向一个新对象
- 特殊调用,即:
foo.call()
/foo.apply()
/foo.bind()
- 参数指定成员
- 作为函数调用,即:
-
找不到所属的 function,就是全局对象
4、面试题
var length = 10
function fn () {
console.log(this.length)
}
const obj = {
length: 5,
method (fn) {
fn()
// arguments[0] === fn // TRUE
// arguments[0]()
arguments[0]()
}
}
obj.method(fn, 1, 2)
Node.js 环境下的 this 指向
- 由于文件代码中最顶层的作用域实际上是一个伪全局环境,所以最顶层的 this 并不指向全局对象
- 严格模式下原本应该指向全局的 this 都会指向 undefined