zoukankan      html  css  js  c++  java
  • call和apply;this;闭包

      对于这两个原生JS的方法,一直有点绕不过来,朦朦胧胧的感觉。现在详细梳理一下:

      两者是基于继承的思想,

    obj.call(thisObj, arg1, arg2, ...);
    obj.apply(thisObj, [arg1, arg2, ...]);
    

      两者作用一致,都是把obj(即this)绑定到thisObj,这时候thisObj具备了obj的属性和方法。或者说thisObj『继承』了obj的属性和方法。

      唯一区别是apply接受的是数组参数,call接受的是连续参数。

      当然,也可以把具体的属性或方法绑定到目标中。
    如:blackCat.say.call(whiteDog)
      原whiteDog并没有say方法,而blackCat有,所有通过call来将say方法绑定给whiteDog。
     
      看到知乎上有位网友的一个比较好记的方法:
      

    猫吃鱼,狗吃肉,奥特曼打小怪兽。

    有天狗想吃鱼了

    猫.吃鱼.call(狗,鱼)

    狗就吃到鱼了

    猫成精了,想打怪兽

    奥特曼.打小怪兽.call(猫,小怪兽)

    就这样记住了。

      关于this,引用一个比较容易理解的例子,https://www.cnblogs.com/zwyyouho-1/p/4974787.html

    首先关于this我想说一句话,这句话记住了this的用法你也就差不多都能明白了:this指的是当前函数的对象。这句话可能比较绕,我会举出很多例子和这句话呼应的!(看下文)
    1.首先看下面这段代码, 定义一个函数,弹下this,

    Js代码  收藏代码
    1. function doSomething(){  
    2.      alert(this);  
    3. }  
    4. doSomething();  
    我是在firefox里面调试的,所以返回的结果是[Object Window]。
    那么这个 [Object Window], 到底是什么呢?看看下面的代码
    Js代码  收藏代码
    1. function doSomething(){  
    2.      alert(this===window);  
    3. }  
    4. doSomething();  
     
    看到弹出了true, 也就是说在这种正常情况下,this其实就是window
    所以,我们定义了一个全局的变量的时候,可以
    var test="Tony";
    也可以
    window["test"]="Tony";
    下面这个例子,进一步说明,正常情况下,函数里的this就是window
    Js代码  收藏代码
    1. var test="Tony";  
    2. function doSomething(){  
    3.      alert(this.test);     //弹出 "Tony";  
    4.      alert(window.test);   //弹出 "Tony";  
    5. }  
    6. doSomething();  
     

    第一次呼应:通过以上几个例子,我想可以说这几个例子中得this指的就是他当前函数doSomething()的Window对象。那顾名思义this.test自然就等于window.test了。事实也是如此。

    2.我再举一个闭包的例子,但是在这里我不会解释什么是闭包,只是讲this的用法,明天我会学习闭包,今天就先当他是一个未知数,来学习this的一个工具。
         看这个例子:
         

    Js代码  收藏代码
    1. var name ="The Window";                     //创建了一个全局变量name  
    2. var object = {                       //又创建了一个对象(创建对象的方法有很多种)  
    3.       name:"My Object",                //创建了一个name属性(属性就是引用非函数)  
    4.       doSomething:function(){          //创建了一个doSomething方法(方法就是引用了函数)  
    5.              return function(){       //这个doSomething方法返回一个匿名函数  
    6.                   return this.name;    //这个匿名函数又返回this.name  
    7.           };  
    8.     }  
    9. };  
    10. alert(object.doSomething()());  
    11.                             //由于这个doSomething方法返回的一个函数,所以这样就可以调用这个函数了  

     
         这段代码的主要解释我都注在了后面,主要想说的就是:这段代码返回的结果是"The Window",而不是我所预期的"My Object",前面不是说了吗? this指的是当前函数的对象, 可是在这里为什么就不是呢?其实就是因为闭包的特性,由于这个匿名函数构成了一个闭包,所以他所保存的就是整个变量对象也就是Window对象。这里先不说为什么,明天学闭包的时候我还会用这个例子的,这里就先接受下来。
         那么如何做才能让结果返回"My Object"呢?还是那句话this指的是当前函数的对象,那么问题就简单了,也就是让this放在doSomething方法里,而不是那个匿名函数里不就可以了吗?修改代码如下:
        

    Js代码  收藏代码
    1. var name ="The Window";                      
    2. var object = {                        
    3.      name:"My Object",                
    4.      doSomething:function(){  
    5.            var abc = this ;          
    6.            return function(){        
    7.                   return abc.name;     
    8.            };  
    9.       }  
    10. };  
    11. alert(object.doSomething()());  

     
    第二次呼应:现在再看代码红色部分做的修改,this是不是指的是当前doSomething()函数的object对象了?那再输出结果自然就是"My Object"了。
          通过这两次呼应,是不是感觉已经对this有了一定的了解呢,其实this用到的地方还很多,以后还会慢慢讲到,比如在jQuery中this依然指的是当前函数的对象。

      关于闭包,下次再学,今天看了太多代码了,脑子有点糊了。https://www.cnblogs.com/yunfeifei/p/4019504.html

    FIGHTING
  • 相关阅读:
    Ubuntu包管理命令 dpkg、apt和aptitude
    Linux curses库使用
    VC皮肤库SkinSharp 1.0.6.6的使用
    HOG(方向梯度直方图)
    2014年国外发布的中国内地大学排名18强名单
    sql语句中BEGIN TRAN...COMMIT TRAN
    搜索框中“请输入搜索keyword”
    IOS基于新浪微博开放平台微博APP
    php字符串标点等字符截取不乱吗 封装方法
    谈一谈struts2和springmvc的拦截器
  • 原文地址:https://www.cnblogs.com/ljwsyt/p/9057093.html
Copyright © 2011-2022 走看看