欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

再談JavaScript中bind、call、apply三個方法的區(qū)別與使用方式

 更新時間:2022年05月03日 11:47:48   作者:Ahuiyo の Blog  
這篇文章主要介紹了Javascript中bind、call、apply三個方法的使用方式,需要的朋友可以參考下

call的基本使用

var ary = [12, 23, 34];
ary.slice();

以上兩行簡單的代碼的執(zhí)行過程為:ary這個實例通過原型鏈的查找機制找到Array.prototype上的slice方法,讓找到的slice方法執(zhí)行,在執(zhí)行slice方法的過程中才把ary數(shù)組進(jìn)行了截取。

注意slice方法執(zhí)行之前有一個在原型上查找的過程(當(dāng)前實例中沒有找到,再根據(jù)原型鏈查找)。

當(dāng)知道了一個對象調(diào)用方法會有一個查找過程之后,我們再看:

var obj = {name:'iceman'};
function fn() {
    console.log(this);
    console.log(this.name);
}
fn(); // this --> window
// obj.fn(); // Uncaught TypeError: obj.fn is not a function
fn.call(obj);

call方法的作用:首先尋找call方法,最后通過原型鏈在Function的原型中找到call方法,然后讓call方法執(zhí)行,在執(zhí)行call方法的時候,讓fn方法中的this變?yōu)榈谝粋€參數(shù)值obj,最后再把fn這個函數(shù)執(zhí)行。

知道這個原型上的原理后,咱們就可以動手分析實現(xiàn)這三個方法了。

bind、call、apply 區(qū)別

  • call 和 apply 都是為了解決改變 this 的指向。作用都是相同的,只是傳參的方式不同。
  • 除了第一個參數(shù)外,call 可以接收一個參數(shù)列表,apply 只接受一個參數(shù)數(shù)組
let a = {
    value: 1
}
function getValue(name, age) {
    console.log(name)
    console.log(age)
    console.log(this.value)
}
getValue.call(a, 'yck', '24')
getValue.apply(a, ['yck', '24'])

bind 和其他兩個方法作用也是一致的,只是該方法會返回一個函數(shù)。并且我們可以通過 bind 實現(xiàn)柯里化

如何實現(xiàn)一個 bind 函數(shù)

對于實現(xiàn)以下幾個函數(shù),可以從幾個方面思考

  • 不傳入第一個參數(shù),那么默認(rèn)為 window
  • 改變了 this 指向,讓新的對象可以執(zhí)行該函數(shù)。那么思路是否可以變成給新的對象添加一個函數(shù),然后在執(zhí)行完以后刪除?

當(dāng)然是肯定的,于是我們可以這樣寫:

Function.prototype.myBind = function (context) {
  if (typeof this !== 'function') {
    throw new TypeError('Error')
  }
  var _this = this
  var args = [...arguments].slice(1)
  // 返回一個函數(shù)
  return function F() {
    // 因為返回了一個函數(shù),我們可以 new F(),所以需要判斷
    if (this instanceof F) {
      return new _this(...args, ...arguments)
    }
    return _this.apply(context, args.concat(...arguments))
  }
}

如何實現(xiàn)一個 call 函數(shù)

Function.prototype.myCall = function (context,...arg) {
  var context = context || window  // 給 context 添加一個屬性
  // getValue.call(a, 'yck', '24') => a.fn = getValue
  //使用symbol 選擇一個獨一無二的值作為新添加的屬性
  let symbol = new Symbol();
  context[symbol] = this;
  let result = context[symbol](...arg)
  // 刪除添加的函數(shù)
  delete context[symbol]  
  return result
}

如何實現(xiàn)一個apply 函數(shù)

apply實現(xiàn)原理與call實現(xiàn)基本類似,只有傳值的方式不一樣。

Function.prototype.myApply = function (context,arg) {
  var context = context || window // 給 context 添加一個屬性
 // getValue.call(a, 'yck', '24') => a.fn = getValue
 //使用symbol 選擇一個獨一無二的值作為新添加的屬性
 let symbol = new Symbol();
 context[symbol] = this;
 let result = context[symbol](arg)
 // 刪除添加的函數(shù)
 delete context[symbol]
 return result
}

經(jīng)過對以上的函數(shù)進(jìn)行檢測 , 完美通過。

const obj = {  
 name : 'xiaoxiao',  
 getName : function (arg) {  
 console.log(`我是${this.name}里面的,我里面有${arg}`);  
 }  
}  
obj.getName([0,0,0,0,0]); // 我是xiaoxiao里面的  
const obj2 = {  
 name : 'huahua'  
}  
//傳值不一樣  
obj.getName.myCall(obj2,1,1,1,1,1,1);  
obj.getName.myBind(obj2)(2,2,2,2,2,2);  
obj.getName.myApply(obj2,[3,3,3,3,3,3]);

 更多關(guān)于JS中call、apply三個方法的區(qū)別與使用方式請查看下面的相關(guān)鏈接

相關(guān)文章

  • 基于javascript實現(xiàn)頁面加載loading效果

    基于javascript實現(xiàn)頁面加載loading效果

    這篇文章主要為大家詳細(xì)介紹了基于javascript實現(xiàn)頁面加載loading效果的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-03-03
  • JS實現(xiàn)音量控制拖動

    JS實現(xiàn)音量控制拖動

    這篇文章主要為大家詳細(xì)介紹了JS實現(xiàn)音量控制拖動,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • js消除圖片小游戲代碼

    js消除圖片小游戲代碼

    這篇文章主要介紹了js消除圖片小游戲代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • JavaScript變量作用域及內(nèi)存問題實例分析

    JavaScript變量作用域及內(nèi)存問題實例分析

    這篇文章主要介紹了JavaScript變量作用域及內(nèi)存問題,結(jié)合實例形式分析了javascript全局變量、局部變量、塊級作用域等概念及內(nèi)存優(yōu)化問題相關(guān)操作技巧,需要的朋友可以參考下
    2019-06-06
  • 基于javascript實現(xiàn)最簡單選項卡切換

    基于javascript實現(xiàn)最簡單選項卡切換

    這篇文章主要為大家詳細(xì)介紹了基于javascript實現(xiàn)最簡單選項卡切換,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • JavaScript中閉包的詳解

    JavaScript中閉包的詳解

    本文主要介紹了JavaScript中閉包的相關(guān)知識。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04
  • JavaScript中關(guān)于class的調(diào)用方法

    JavaScript中關(guān)于class的調(diào)用方法

    下面小編就為大家?guī)硪黄琂avaScript中關(guān)于class的調(diào)用方法。具有很好的參考價值,希望對大家有所幫助
    2017-11-11
  • 微信小程序 scroll-view的使用案例代碼詳解

    微信小程序 scroll-view的使用案例代碼詳解

    這篇文章主要介紹了微信小程序 scroll-view的使用案例分析,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • 微信小程序?qū)崿F(xiàn)簡易計算器

    微信小程序?qū)崿F(xiàn)簡易計算器

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)簡易計算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 使用js獲取偽元素的content實例

    使用js獲取偽元素的content實例

    下面小編就為大家?guī)硪黄褂胘s獲取偽元素的content實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10

最新評論