THIS 的指向
JavaScript的 this 指向调用该函数的对象
JavaScript中所有的函数都有属性,就如对象有属性一样。函数执行阶段(也即执行上下文的执行阶段)会获取this属性的值,此时this就是一个变量,储存着调用该函数的对象的值。
eg.
1 | var a = "coffe"; |
上面代码中,func的调用者未通过点操作符. 指明,那它的调用者就是默认的全局对象window,func函数作为window的一个方法,其体内的this.a就是明确指代window中属性a
this的指向规则
1 默认指向
独立函数调用(无法应用其他指向规则时),this指向全局对象window
在setInterval和setTimeout中传入函数时,函数中的this会指向window对象
2 隐式指向
一、 函数体内this的指向, 由调用位置的调用者决定。
若调用者调用的函数,为对象A的方法,那么该函数在被调用时,其内部的this指向对象A。
tips: 函数被当做某个对象的方法而调用 即 隐式指向。
二、 this指向最终调用函数的对象。即指向最靠近的被调用函数的对象,而不是离得远的。
隐式丢失
隐式丢失最容易在赋值时发生;隐式丢失发生时,调用这个函数会应用默认指向规则
eg.
1 | function func() { |
3 显示指向
JavaScript内置对象Function的三个原型方法call()、apply()和bind(),它们的第一个参数是一个对象,它们会把这个对象绑定到this,接着在调用函数时让this指向这个对象。
另外,使用bind可以修正SetTimeout和SetInterval的this指向。
4 “new”操作符指向
在JavaScript 中,构造函数只是一些使用new操作符时被调用的函数。它们并不会属于某个类,也不会实例化一个类。只是被new操作符调用的普通函数而已。
使用new 来调用函数,会自动执行下面的操作:
构造一个全新的对象;
将构造函数的作用域赋给新对象(因此this就指向了这个新对象);
执行构造函数中的代码(为这个新对象添加属性、方法等);
如果函数没有返回其他对象,那么返回这个新对象。
例外情况
1 被忽略的this
null 或者undefined 作为this指向的对象传入call、apply或者bind时,实际应用默认指向规则。
function func() {
console.log(this.a);
}
var a = 2;
func.call(null); //>> 2 //this指向了window
2 隐式指向中的隐式丢失
在赋值时最容易发生。隐式丢失后,自动应用默认指向规则
3 箭头函数
箭头函数不遵守this的四种指向规则,而是根据函数定义时的作用域来决定 this 的指向。
即 你定义这个箭头函数的时候,该箭头函数在哪个函数里,那么箭头函数体内的this就是它父函数的this。
eg.
1 | function func() { |
- 本文作者:JSZ
- 本文链接:blog.vampuck.com/2022/02/09/this/index.html
- 版权声明:本博客所有文章均采用 BY-NC-SA 许可协议,转载请注明出处!