zoukankan      html  css  js  c++  java
  • 31.this指向(写出调用链,找最近对象) this的默认绑定 隐式绑定 显示绑定(call(绑定对象) apply(绑定对象) 当括号内没放绑定对象的时候恢复默认绑定) bind

      15             this 指向全局对象window

    二:                              this的指向问题

    this指向一个对象:对象叫:函数执行上下文的对象

    this是变化的,默认指向window

      ①:默认绑定(window) ,普通的函数调用

        

                    undefined,先执行函数打印a,后再给a 赋值12,由代码顺序决定的

          ②:隐式绑定:函数被某个对象所拥有,该对象调用该函数时该函数内部this指向拥有它的对象,

                                  发生在调用过程中

                                   new 操作符优先级高于隐式绑定

                以下两个例子区分:注意是谁在调用

                 

                        fun()    调用   打印 undefined,因为是window调用,不是包含它的对象调用

            注意:   写函数名是把函数体赋值给 fn,如果写的是 fn:fun(),会执行fun(),然后把fun的return值返回给fn

              

             最后一个  fn(),是报错。对象的属性必须调用才能使用,单独拿出来会报错。

             注意:多个对象嵌套调用:有两种情况:

             注意:想要知道this的指向,就要把他的调用链写出来,找出调用链上的对象,调用链上没有对象,就是调用链最顶端的对象。

                ①:对象.函数         函数里的this指向最外层对象                        (指向字面对象,不用管是对象1里的foo指向了对象2的fn)

               

               foo==fun,所以fun指向foo所在obj2

              多个对象嵌套,foo里的this,指向调用它的对象,指向obj2,根据代码字面来

              ②:对象1.对象2.函数()       函数里的this指向对象2,指向字面最近的对象(就内原则)

              

               foo也就是obj,所以调用fn(0的最近对象是obj,故为30

      隐式绑定会造成 this丢失的情况

     把函数赋值给全局变量,函数里的this指向window

           相当于未加修饰的函数调用,指向的是window

    new 操作符优先级高于隐式绑定

     new 后面一定是构造函数   故 obj.foot(4)是个整体 

    ③:this的显示绑定

          1.call(绑定对象),绑定对象后执行函数

         foo()this 指向window                  foo.call(obj),this指向obj              call括号里就是this的绑定对象

       2.apply(绑定对象,绑定对象后执行函数

         this指向obj,与call一样

     原理:如果括号内不是对象,会把如123包装成对象,this.a 指向的是对象123中的a,没有,故为undefined;

     注意:undefined  null 没有包装类,括号内的对象如果没有包装类,就会忽视它,恢复成默认绑定window

          foo.call(obj)foo里的指向obj,指定仅限于此句代码,不会永久指定。

                                                                                                                                foo(),里的this,指向window 

    永久绑定this的方法(硬绑定):放入函数表达式里,调用函数

       调用bar,foo里面的this永远指定的都是obj

       3.bind(ES5引入的硬绑定方法,this不会改变):

         与apply call 的区别:bind在绑定后不会执行函数,要用新变量接收,变量名充当函数名, 用变量名()方式调用

      

          

    call 与 apply 的区别:传的参数不一样

    call :第一个参数为要绑定的对象  之后的参数是用来给需要绑定this指向的函数传递参数

    apply:只有两个参数,第一个对象是this要绑定的对象,第二个对象,是参数数组,而非call里的散列参数

    apply 不能这么用:

    eg:

      c是【3,4】 d没传所以是undefined

    例题:

     第一个应该是console.log(bar(4))

     new 操作符 比显示绑定优先级高。

    apply  特殊用法:用数组给函数传递多个参数:(小技巧),因为apply 的第二个数组参数会自动匹配函数的多个参数。

          

       

     

             

  • 相关阅读:
    【线段树合并】联通分量计数
    莫队算法
    Ubuntu实用软件安装[转]
    装系统·折腾记
    Qt环境配置 + Qt使用教程
    Google题解
    隐含马尔科夫模型
    Pythonの坑
    C++11并发编程个人小结
    微软2017年预科生计划在线编程笔试
  • 原文地址:https://www.cnblogs.com/yzdwd/p/12532200.html
Copyright © 2011-2022 走看看