1. <sup id="1kcns"></sup>

    2. <rt id="1kcns"><legend id="1kcns"></legend></rt>
      国产AV巨作丝袜秘书,国产精品久久香蕉免费播放,国产草草影院ccyycom,涩涩爱狼人亚洲一区在线,日本阿v片在线播放免费,国产精品一区二区三区蜜臀,精品一区二区三区在线观看l,av深夜免费在线观看

      JavaScript 中的 call()、apply()、bind() 的詳解

      2018-4-22    seo達(dá)人

      如果您想訂閱本博客內(nèi)容,每天自動(dòng)發(fā)到您的郵箱中, 請(qǐng)點(diǎn)這里

      三種方法的作用

      在 JavaScript 中

      1. callapply 和 bind 是 Function 對(duì)象自帶的三個(gè)方法,都是為了改變函數(shù)體內(nèi)部 this 的指向。
      2. callapply 和 bind 三者第一個(gè)參數(shù)都是 this 要指向的對(duì)象,也就是想指定的上下文
      3. callapply 和 bind 三者都可以利用后續(xù)參數(shù)傳參。
      4. bind 是返回對(duì)應(yīng) 函數(shù),便于稍后調(diào)用;apply 、call 則是立即調(diào)用 。
      舉個(gè)栗子
      function fruits() {}
      
      fruits.prototype = {
         color: 'red',
         say: function() { console.log('My color is ' + this.color); 
         }
      } var apple = new fruits;
      apple.say(); // 此時(shí)方法里面的this 指的是fruits // 結(jié)果: My color is red
          
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

      如果我們有一個(gè)對(duì)象 banana= {color : 'yellow'} ,我們不想重新定義 say 方法,那么我們可以通過(guò) call 或 apply 用 apple 的 say 方法:

      var banana = { color: 'yellow' };
      apple.say.call(banana); // 此時(shí)的this的指向已經(jīng)同過(guò)call()方法改變了,指向的是banana,this.color就是banana.color='yellow'; // 結(jié)果是My color is yellow 
      
      apple.say.apply(banana); // 同理,此時(shí)的this的指向已經(jīng)同過(guò)apply()方法改變了,指向的是banana,this.color就是banana.color ='yellow'; // 結(jié)果是My color is yellow
      
      apple.say.apply(null); // nullwindow下的,此時(shí),this 就指向了window ,但是window下并沒(méi)有clolr這個(gè)屬性,因此this.clolr就是window.color=undefined; // 結(jié)果是My color is undefined
          
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      call 和 apply 的區(qū)別

      二者的作用完全一樣,知識(shí)接受 參數(shù) 的方式不太一樣。

      call 是把參數(shù)按順序傳遞進(jìn)去,而 apply 則是把參數(shù)放在 數(shù)組 里面。

      var array1 = [12,'foo',{name:'Joe'},-2458]; var array2 = ['Doe' , 555 , 100]; Array.prototype.push.call(array1, array2); // 這里用 call 第二個(gè)參數(shù)不會(huì)把 array2 當(dāng)成一個(gè)數(shù)組,而是一個(gè)元素 // 等價(jià)于 array1.push("'Doe' , 555 , 100"); // array1.length=5; Array.prototype.push.apply(array1, array2); // 這里用 apply 第二個(gè)參數(shù)是一個(gè)數(shù)組 // 等價(jià)于:  array1.push('Doe' , 555 , 100); // array1.length=7;
          
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      類(lèi)(偽)數(shù)組使用數(shù)組方法
      var divElements = document.getElementsByTagName('div'); // 雖然 divElements 有 length 屬性,但是他是一個(gè)偽數(shù)組,不能使用數(shù)組里面的方法 Array.isArray(divElements);// false var domNodes = Array.prototype.slice.call(document.getElementsByTagName('div')); // 將數(shù)組對(duì)象 Array 里的 this 指向偽數(shù)組 document.getElementsByTagName('div'),  // slice() 方法可從已有的數(shù)組中返回選定的元素,不傳參數(shù)是,返回整個(gè)數(shù)組  Array.isArray(domNodes);// true
          
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      驗(yàn)證一個(gè)對(duì)象的類(lèi)型可以用
      Object.prototype.toString.call(obj)
          
      • 1
      bind() 方法

      bind() 方法會(huì)創(chuàng)建一個(gè) 新函數(shù),稱(chēng)為綁定函數(shù),當(dāng)調(diào)用這個(gè)綁定函數(shù)時(shí),綁定函數(shù)會(huì)以創(chuàng)建它時(shí)傳入 bind() 方法的第一個(gè)參數(shù) 作為 this,傳入 bind() 方法的 第二個(gè)以及以后的參數(shù)加上綁定函數(shù)運(yùn)行時(shí)本身的參數(shù)按照順序作為原函數(shù)的參數(shù)來(lái)調(diào)用原函數(shù)。

      注意bind()方法創(chuàng)建的函數(shù)不會(huì)立即調(diào)用,在下面的例子中,最后 func() 才調(diào)用了函數(shù),這是它與 callapply的區(qū)別。

      var bar = function(){ console.log(this.x);
      } var foo = {
          x:3 }
      bar(); // undefined var func = bar.bind(foo); //此時(shí)this已經(jīng)指向了foo,但是用bind()方法并不會(huì)立即執(zhí)行,而是創(chuàng)建一個(gè)新函數(shù),如果要直接調(diào)用的話(huà) 可以bar.bind(foo)() func(); // 3
          
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

      在 Javascript 中,多次 bind() 是無(wú)效的。更深層次的原因, bind() 的實(shí)現(xiàn),相當(dāng)于使用函數(shù)在內(nèi)部包了一個(gè) call / apply ,第二次 bind() 相當(dāng)于再包住第一次 bind() ,故第二次以后的 bind 是無(wú)法生效的。

      var bar = function(){ console.log(this.x);
      } var foo = {
        x:3 } var sed = {
        x:4 } var func = bar.bind(foo).bind(sed);
      func(); //3 var fiv = {
        x:5 } var func = bar.bind(foo).bind(sed).bind(fiv);
      func(); //3

      日歷

      鏈接

      個(gè)人資料

      存檔

      主站蜘蛛池模板: 精品国产性色无码av网站| 亚洲高清 一区二区三区| 国产少妇在线| Jizz国产色系免费| 苍井空毛片精品久久久| 日韩精品有码中文字幕| 色婷婷久| 欧洲美熟女乱又伦av影片| 国产视频网站在线观看| 久操视频在线免费观看| 亚洲欧美人成人让影院| 性色在线视频精品| 又大又粗又爽18禁免费看| 国产自产av一区二区三区性色| 日韩天码| 少妇xxxxx性开放| 激情综合网激情综合| 91久久人澡人妻天天做天天爽 | 欧美成人一区二区三区| 中国美女a级毛片| 欧美粗大猛烈老熟妇| 精品欧美一区手机在线观看| 五月天婷婷一本到伊人| 国产成人A区在线观看视频| 亚洲国产激情一区二区三区| 亚洲av成人无码天堂| 米奇激情久久网| 久久人妻中文字幕免费| 国产精品自在线拍国产手机版| 国产又爽又黄又爽又刺激| 亚洲一区二区国产av| 日日艹| 亚洲成人小说| 国产一精品一AV一免费爽爽 | 男人的天堂va在线无码| 成人黄色一级片一级片| 婷婷伊人綜合中文字幕小说| 18禁无遮挡国产免费观看 | 国产精品乱码人妻一区二区三区 | 国产精品一区二区色综合| 国产精品视频一区不卡|