首先我们需要知道 This 是什么?
从字面意思,this指的是当前;这个
对于Javascript来说它是一个指针型变量,它动态指向当前函数的运行环境。
This 指向如何去确定
this是在运行时进行绑定而不是在编写时
绑定方法
1. 默认绑定
function hello(){
console.log(this)
}
hello()//调用 this 指向为全局 Window{...}
函数的这种调用方式下 this 指向全局对象。
2. 隐式绑定
function hello(){
console.log(this)
}
let obj = {
a:10,
b:20,
c:hello
}
obj.c() // 控制台打印结果为 :{a:10,b:20,c:f}
此时 this 的绑定规则称为隐式绑定,我们不能直接看出函数的调用位置,在调用时它实际调用位置在obj对象里,实际调用c时他的执行上下文对象就为obj对象,所以文中this指向obj
3. 显示绑定
function hello(){
console.log(this)
}
let obj = {
a:10,
b:20
}
hello.call(obj) // 控制台打印结果为 :{a:10,b:20}
我们利用 call 方法直接将 foo 函数内部的 this 指向了 obj 对象,这就是显式绑定。
4. New绑定
使用new创建函数
- 创建一个新对象
- 这个新对象会被执行原型连接
- 新对象会绑定到函数调用的this
- 如果函数没有返回其它对象,那么
new表达式中的函数调用会自动返回这个新对象
function hello(text){
this.text = text
}
let say = new hello('world')
console.log(say.text) // 控制台打印结果为 world
上段代码我们使用 new 关键词调用了 hello 函数,这是 new 绑定规则。
总结
对于 this的复习就此先告一段落,对于MDN上在严格模式下的差异暂不做考究。