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 的第二个数组参数会自动匹配函数的多个参数。