是什么?
this关键字是JavaScript中最复杂的机制之一。是一个特别的关键字,被自动定义在各个函数作用域中
* 需要明确的是,this既不指向函数自身也不指向函数的词法作用域
* 所有函数内部都有一个this
* this实际上是在函数被调用时发生绑定,指向谁完全取决于函数在哪里被调用
---以上《你不知道的JavaScript上》
this的绑定规则
- 默认绑定 window
function fn() { console.log(this.a); } var a=2; fn();
说明:fn函数中没有a这个变量和值,
a是在全局中声明的变量, 调用fn后打印2, 说明this的指向了全局变量。 -
隐式绑定:在命名函数的内容调用一个指向函数的属性,然后通过这个属性间接的引用函数,从而把this间接绑定到对象中
function fn() { console.log(this.a) } var obj={ a:2, fn:fn }; obj.fn();
说明 :当fn被调用时,加上了对obj的作用。当函数拥有全局上下文对象时,隐式绑定会自动将函数调用中的this绑定到全局上下对象中,此时的this.a与obj.a是一样的。
-
显示绑定
function fn() { console.log(this.a) } var obj={ a:2 } fn.call(obj);
说明:通过call,调用fn时候强制将this绑定到了obj上
- new 绑定
function fn() { this.a=a; } var bar =new fn(2); console.log(bar.a);
说明:使用new调用fn()时,会构造一个新的对象将其绑定到fn的this上。
四个绑定规则的优先级
默认绑定优先级最低,显示绑定高于隐式绑定,new绑定优先级高于隐式绑定
总结:如何确定this的值?
- 方式
- test() :window 默认绑定,严格模式下绑定到undefined
- p.test() :p 上下文对象的调用,就是指向的p。 --隐式绑定
- new test() :新创建的对象 new绑定 ,this指向实例对象
- p.call(obj): 即指定的obj对象,指向谁是由你决定的。-- 显示绑定
注意如果指向不确定就直接指向window