美文网首页
你不知道的JavaScript 笔记

你不知道的JavaScript 笔记

作者: 怡宝丶 | 来源:发表于2018-08-03 23:29 被阅读0次

this绑定的时机

  • this是在运行时候绑定的,并不是在编写的时候,它的上下文取决于函数调用时候的各种条件。this的绑定和函数声明的位置没有任何关系,只取决于函数调用的位置。

this的绑定规则

  1. 默认绑定
    独立的函数调用,可以把这条规则看做是无法应用其他规则的默认规则。

        function foo(){
          console.log(this.a)
        }      
        var a = 2;
        foo()    //2
    
        // 这里的foo()函数是直接不带任何修饰的函数调用,因此只能使用默认绑定
    
  2. 隐式绑定
    函数调用位置是否有上下文对象,或者说是否被某个对象包含。

      function foo() {
         console.log(this.a)
      }
      var obj = {
        a: 2,
        foo:foo
      }
      obj.foo() // 2
      // 这里的隐私绑定会把函数调用中的this绑定到这个上下文对象。
    

    2.1 隐式丢失
    一个常见的问题是隐式绑定的函数会丢失绑定对象,也就是说会默认应用默认绑定,这时候的this可能会被绑定到全局上或者是undefined

        function foo() {
          console.log(this.a)
        }
        var obj = {
          a: 2,
          foo:foo
        }
        var bar = obj.foo();
        var a = 'global';
        bar() // global
    

    这里的bar函数引用了obj.foo,但实际上引用的是foo函数本身,因此此时的bar函数其实是一个不带任何修饰的函数调用,因此应用了默认绑定。
    参数传递也是一种隐式赋值。传入的回调函数中一般也是隐式丢失,应用默认绑定。

  3. 显式绑定
    使用bind apply call等方法签字改变this指向,我们称为显示绑定

         function foo() {
           console.log(this.a)
         }
         var obj = {
           a: 2
         }
         foo.call(obj) //2
    

相关文章

网友评论

      本文标题:你不知道的JavaScript 笔记

      本文链接:https://www.haomeiwen.com/subject/lqqpvftx.html