最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS中call apply bind函數(shù)手寫實(shí)現(xiàn)demo

 更新時間:2023年03月15日 16:18:41   作者:茶老師  
這篇文章主要為大家介紹了JS中call apply bind函數(shù)手寫實(shí)現(xiàn)demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文

JavaScript 中的函數(shù)是一等公民,可以像普通變量一樣被傳遞和使用。這種靈活性使得函數(shù)可以被用于各種場景,比如對象方法的調(diào)用、構(gòu)造函數(shù)的創(chuàng)建和原型繼承等。在函數(shù)的使用過程中,call、applybind 是 JavaScript 中比較常用的一些方法,它們可以改變函數(shù)執(zhí)行的上下文,同時還能傳遞參數(shù)。

在本篇文章中,我們將會詳細(xì)介紹 call、apply、bind 這三個方法,并且手動模擬實(shí)現(xiàn)它們。

call 方法

call 方法用于調(diào)用一個函數(shù),并且可以設(shè)置函數(shù)內(nèi)部的 this 值。它可以讓你將一個函數(shù)的 this 對象指向任意一個對象,并且傳入任意個數(shù)的參數(shù)。

下面是 call 方法的基本語法:

function.call(thisArg, arg1, arg2, ...)

其中:

  • function:要調(diào)用的函數(shù)。
  • thisArg:設(shè)置 function 函數(shù)中的 this 對象的值。
  • arg1、arg2、...:傳遞給 function 函數(shù)的參數(shù),可以有多個。

下面是一個簡單的示例:

const person = {
  name: 'Zhang San',
  sayHi() {
    console.log(`Hi, my name is ${this.name}.`);
  },
};
person.sayHi(); // 輸出 "Hi, my name is Zhang San."
const otherPerson = {
  name: 'Zhang San',
};
person.sayHi.call(otherPerson); // 輸出 "Hi, my name is Zhang San."

在上面的例子中,我們創(chuàng)建了一個 person 對象,它有一個 sayHi 方法,用于輸出自我介紹。我們使用 call 方法將 person 對象的 sayHi 方法綁定到 otherPerson 對象上,并且輸出了 otherPerson 對象的名字。

接下來,我們將手動模擬實(shí)現(xiàn) call 方法,實(shí)現(xiàn)一個名為 myCall 的函數(shù)。

Function.prototype.myCall = function(context, ...args) {
  context = context || window;
  context.fn = this;
  const result = context.fn(...args);
  delete context.fn;
  return result;
};

上面的代碼中,我們給 Function.prototype 添加了一個新的方法 myCall。該方法接收兩個參數(shù),第一個參數(shù) context 表示要綁定的 this 值,第二個參數(shù) args 表示要傳遞給函數(shù)的參數(shù)列表。如果第一個參數(shù) context 為空,則默認(rèn)綁定到全局對象 window 上。

接著,我們在綁定的對象 context 上添加了一個 fn 屬性,并且將當(dāng)前函數(shù)綁定到該屬性上,接著調(diào)用該函數(shù),并將結(jié)果保存到 result 變量中。

最后,我們刪除 context 對象上的 fn 屬性,并將結(jié)果返回。這樣,我們就成功地手動模擬實(shí)現(xiàn) call 方法。

apply 方法

apply 函數(shù)的語法為:function.apply(thisArg, [argsArray]),其中 thisArg 表示函數(shù)執(zhí)行時的上下文對象,也就是函數(shù)中的 this 關(guān)鍵字所指向的對象,argsArray 是一個數(shù)組,表示函數(shù)執(zhí)行時傳遞的參數(shù)列表。

實(shí)現(xiàn)步驟

聲明一個函數(shù),以便在之后使用 apply 函數(shù)。

function sum(a, b) {
  return a + b;
}

然后我們現(xiàn)在需要為函數(shù) sum 添加 apply 方法,該方法接受兩個參數(shù):上下文對象 thisArg 和參數(shù)數(shù)組 argsArray。

Function.prototype.apply = function(thisArg, argsArray) {
  // 代碼實(shí)現(xiàn)
};

apply 函數(shù)中,第一個參數(shù) thisArg 表示要調(diào)用函數(shù)的上下文對象。如果沒有傳遞 thisArg,那么默認(rèn)為全局對象 window。

Function.prototype.apply = function(thisArg, argsArray) {
  thisArg = thisArg || window;
};

我們需要在函數(shù)執(zhí)行時將函數(shù)中的 this 關(guān)鍵字指向上下文對象 thisArg,從而改變函數(shù)的上下文對象。

Function.prototype.apply = function(thisArg, argsArray) {
  thisArg = thisArg || window;
  let fn = Symbol('fn');
  thisArg[fn] = this;
  let result = thisArg[fn](...argsArray);
  delete thisArg[fn];
  return result;
};

在上述代碼中,我們使用了一個新的 Symbol 類型的變量 fn,用于存儲函數(shù)對象。然后我們將函數(shù)對象存儲在上下文對象 thisArg 中,并立即執(zhí)行該函數(shù),從而改變函數(shù)的上下文對象。最后,我們刪除存儲在上下文對象中的函數(shù)對象,并返回函數(shù)執(zhí)行的結(jié)果。

下面是完整的 apply 函數(shù)的代碼實(shí)現(xiàn):

function sum(a, b) {
  return a + b;
}
Function.prototype.apply = function(thisArg, argsArray) {
  thisArg = thisArg || window;
  let fn = Symbol('fn');
  thisArg[fn] = this;
  let result = thisArg[fn](...argsArray);
  delete thisArg[fn];
  return result;
};
console.log(sum.apply(null, [1, 2])); // 輸出:3

bind 方法

bind函數(shù)也是對函數(shù)的this指向進(jìn)行修改的函數(shù),不同于 callapply 函數(shù)的立即執(zhí)行,bind 函數(shù)返回一個新的函數(shù),這個新的函數(shù)可以在后續(xù)調(diào)用時再傳入?yún)?shù)并執(zhí)行。bind 函數(shù)的實(shí)現(xiàn)可以通過在返回的新函數(shù)中使用閉包來保存?zhèn)魅氲?this 值,并返回一個新函數(shù)。

bind 函數(shù)的語法如下:

function.bind(thisArg[, arg1[, arg2[, ...]]])

其中,thisArg 為需要綁定的 this 值,arg1 , arg2 等為新函數(shù)的參數(shù)。bind 函數(shù)返回一個新函數(shù),這個新函數(shù)的 this 值被綁定為傳入的 thisArg 值,同時可以傳入額外的參數(shù)作為新函數(shù)的參數(shù)。當(dāng)調(diào)用返回的新函數(shù)時,會以傳入的參數(shù)和之前綁定的 this 值作為參數(shù)調(diào)用原函數(shù)。

下面是一個手動實(shí)現(xiàn)的 bind 函數(shù):

Function.prototype.bind2 = function(thisArg) {
  var self = this;
  var args = Array.prototype.slice.call(arguments, 1);
  return function() {
    var bindArgs = Array.prototype.slice.call(arguments);
    return self.apply(thisArg, args.concat(bindArgs));
  };
}

在實(shí)現(xiàn)中,先保存 this 的指向,然后將傳入的參數(shù)放到 args 數(shù)組中。接下來返回一個新的函數(shù),這個新的函數(shù)會保存 bind2 函數(shù)中的 this 值和 args 數(shù)組中的參數(shù)。在新函數(shù)被調(diào)用時,會將之前保存的 this 值和 args 數(shù)組中的參數(shù)與新傳入的參數(shù)合并為一個數(shù)組,并調(diào)用原函數(shù)的 apply 方法傳入這個數(shù)組作為參數(shù),以達(dá)到修改 this 值和傳入?yún)?shù)的目的。

總結(jié)

本文我們介紹了 callapplybind 這三個函數(shù)的作用及其實(shí)現(xiàn)原理,并手動模擬實(shí)現(xiàn)了這三個函數(shù)。實(shí)現(xiàn)過程中,我們學(xué)習(xí)了函數(shù)的 this 指向、函數(shù)的 applycall 方法、以及函數(shù)的柯里化等知識點(diǎn)。

掌握這些知識點(diǎn)有助于我們更好地理解 JavaScript 中的函數(shù)機(jī)制,并能夠編寫更加靈活、高效的代碼。

以上就是JS中call apply bind函數(shù)手寫實(shí)現(xiàn)demo的詳細(xì)內(nèi)容,更多關(guān)于JS call apply bind函數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解babel是如何將class語法糖轉(zhuǎn)換為es5的語法

    詳解babel是如何將class語法糖轉(zhuǎn)換為es5的語法

    這篇文章主要詳細(xì)介紹了babel是如何將class語法糖轉(zhuǎn)換為es5的語法,文中通過代碼示例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • 淺談JavaScript中的對象及Promise對象的實(shí)現(xiàn)

    淺談JavaScript中的對象及Promise對象的實(shí)現(xiàn)

    這篇文章主要介紹了淺談JavaScript中的對象及Promise對象的實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2015-11-11
  • JavaScript中數(shù)組常見操作技巧

    JavaScript中數(shù)組常見操作技巧

    下面介紹JavaScript中的數(shù)組對象遍歷、讀寫、排序等操作以及與數(shù)組相關(guān)的字符串處理操作,需要的的朋友參考下吧
    2017-09-09
  • JavaScript DOM節(jié)點(diǎn)操作方式全面講解

    JavaScript DOM節(jié)點(diǎn)操作方式全面講解

    DOM(Document Object Model 文檔對象模型)定義了訪問和操作文檔的標(biāo)準(zhǔn)方法。整個瀏覽器網(wǎng)頁就是一個Dom樹形結(jié)構(gòu),這篇文章主要介紹了JavaScript DOM節(jié)點(diǎn)操作方式
    2022-10-10
  • UNiapp 微信小程序漸變不生效的解決方案

    UNiapp 微信小程序漸變不生效的解決方案

    這篇文章主要介紹了UNiapp 微信小程序漸變不生效的解決方案,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • js輪播圖之旋轉(zhuǎn)木馬效果

    js輪播圖之旋轉(zhuǎn)木馬效果

    這篇文章主要為大家詳細(xì)介紹了js輪播圖之旋轉(zhuǎn)木馬效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • JavaScript?CSS解析B站的彈幕可以不擋人物原理及技巧

    JavaScript?CSS解析B站的彈幕可以不擋人物原理及技巧

    這篇文章主要為大家介紹了JavaScript?CSS解析B站的彈幕可以不擋人物原理及技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • JavaScript 數(shù)組常見操作技巧

    JavaScript 數(shù)組常見操作技巧

    這篇文章主要給大家分享的是JavaScript 數(shù)組常見操作技巧,數(shù)組是 JavaScript 中常見數(shù)據(jù)類型之一,關(guān)于它的一些操作方法,我在這里做一下簡單記錄和總結(jié),需要的小伙伴可以參考一下
    2022-02-02
  • 使用postMesssage()實(shí)現(xiàn)跨域iframe頁面間的信息傳遞方法

    使用postMesssage()實(shí)現(xiàn)跨域iframe頁面間的信息傳遞方法

    下面小編就為大家?guī)硪黄褂胮ostMesssage()實(shí)現(xiàn)跨域iframe頁面間的信息傳遞方法。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家一個參考。一起跟隨小編過來看看吧
    2016-03-03
  • 前端使用crypto-js庫aes加解密詳細(xì)代碼示例

    前端使用crypto-js庫aes加解密詳細(xì)代碼示例

    在前端開發(fā)中數(shù)據(jù)的加密和解密是為了保障用戶隱私和數(shù)據(jù)的安全性而常見的任務(wù),這篇文章主要給大家介紹了關(guān)于前端使用crypto-js庫aes加解密的相關(guān)資料,需要的朋友可以參考下
    2024-03-03

最新評論

汕尾市| 喀喇| 澳门| 晋宁县| 灌云县| 镇远县| 惠水县| 游戏| 兴山县| 蒲城县| 深泽县| 远安县| 元阳县| 安阳县| 荆州市| 兴化市| 仙游县| 玉溪市| 奉化市| 建德市| 峨眉山市| 乌鲁木齐市| 大邑县| 甘谷县| 翁源县| 水富县| 南漳县| 若羌县| 壤塘县| 建阳市| 大兴区| 县级市| 会同县| 浦城县| 孝昌县| 乐山市| 漠河县| 扶风县| 乐平市| 即墨市| 东乌|