关于this指向及常用相关知识记录

2017-10-25  本文已影响17人  进击的程序茗

this指向说明:

this指向问题:

此前对于click,setTimeOut理解成了其回调函数中的this会指向window,但是这样的理解是不准确的,

          document.getElementById('test').onclick=function(){
                console.log(this);//this输出的是DOM元素
                aa()
           }
          function aa(){
             console.log(this)//this输出的是window对象
          }
     let person = {
            name:'jike',
            init:function(){
                console.log(this);//{name: "jike", init: ƒ}
                document.body.onclick =function(){
                    console.log(this); //body元素          
                }
            }
        }
        person.init();

通过这两个例子可以更加了解一下方法调用中this指向调用该方法的对象这句话

call、apply、bind

对于上面的第一种示例,我们并不希望this指向了全局window,所以我们要对aa函数进行更改其this指向的改变,由此提到了三个方法。call、apply、bind都是可以改变this的指向。
call、apply区别在于传递的第二个参数不同,apply接受数组。
call、applybind的区别在于call、apply为调用及立刻执行,而bind则不会立刻执行。把上面的代码改成如下方式,通过执行即可看出区别,bind要在调用后再去主动执行一次:

       document.getElementById('test').onclick=function(){
                console.log(this);//this输出的是DOM元素
                aa.call(this)
                aa.apply(this)
               aa.bind(this)()
           }
          function aa(){
             console.log(this)//this输出的是DOM元素
          }

关于bind

提起bind我们就会提到兼容问题,在IE8中是并没有兼容bind函数的,那么对于bind函数的兼容性写法如下:

          function bind(f,o){
                if(f.bind){
                    return f.bind(o);
                }else{
                    return f.apply(o)
                }
           }//该代码为权威指南上的代码,目前凭记忆写下的,我回去再查一下书,如果我写错了,那么我再回来改

关于箭头函数

对于上面的第二个示例问题,或者说在业务中用到的经常是第二个示例,我们希望body的onclick里面的this指向的是person,那么此时就可以用到箭头函数,代码更改如下:

     let person = {
            name:'jike',
            init:function(){
                console.log(this);
                document.body.onclick = ()=>{//此处采用了箭头函数
                    console.log(this); //{name: "jike", init: ƒ}  
                }
            }
        }
        person.init();

http://blog.getify.com/arrow-this/关于箭头函数对于this的作用,在这篇文章里提到了箭头函数并没有像bind一样改变this的指向,而是生来局部,完全不把 this 绑定到里面去,也就是去上一层去查找this

Tbc

目前先想到这里,如果有遇到其它问题,再过来记录,如有错误,还请指正,谢谢。

个人博客:
进击的程序茗

上一篇下一篇

猜你喜欢

热点阅读