JavaScript高级:this是什么?

是什么?

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 上下文对象的调用,隐式绑定
    • new test() :新创建的对象 new绑定
    • p.call(obj):obj 即指定的对象 显示绑定
    注意如果指向不确定就直接指向window

猜你喜欢

转载自blog.csdn.net/XZZ2222/article/details/80380928