成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Bind、Call、Apply的區別?如何實現bind

開發 前端
bind() 方法創建一個新的函數,該函數的 this 關鍵字被綁定到指定的對象,并且提供了一系列參數。不會立即執行函數,而是返回一個新的函數,可以稍后調用。

bind、call、apply的作用?

bind, call, 和 apply 是 JavaScript 中非常有用的方法,它們主要用于改變函數的執行上下文以及傳遞參數。

  • bind:bind()方法創建一個新的函數,該函數的this關鍵字被綁定到指定的對象,同時還可以提供一系列參數。這對于在事件處理函數、定時器或回調函數中綁定上下文非常有用。
const obj = {
  x: 42
};


function getX(y) {
  return this.x + y;
}


const boundGetX = getX.bind(obj);
console.log(boundGetX(2)); // 輸出 44
  • call:call()方法調用一個函數,允許你指定函數執行時的上下文(this),并傳遞一系列參數作為函數的參數。這在需要立即調用函數并指定上下文的情況下非常有用。
const obj = {
  x: 42
};


function getX(y) {
  return this.x + y;
}


console.log(getX.call(obj, 2)); // 輸出 44
  • apply:apply()方法調用一個函數,允許你指定函數執行時的上下文(this),同時傳遞一個數組或類數組對象作為函數的參數。這在需要傳遞參數數組的情況下非常有用。
const obj = {
  x: 42
};


function getX(y) {
  return this.x + y;
}


console.log(getX.apply(obj, [2])); // 輸出 44

bind、call、apply的區別?

bind, call, 和 apply 是 JavaScript 中用于處理函數執行上下文和參數傳遞的方法,它們有著不同的特點和用途。

  • bind()

bind() 方法創建一個新的函數,該函數的 this 關鍵字被綁定到指定的對象,并且提供了一系列參數。不會立即執行函數,而是返回一個新的函數,可以稍后調用。

const obj = {
  x: 42
};


function getX(y) {
  return this.x + y;
}


const boundGetX = getX.bind(obj);
console.log(boundGetX(2)); // 輸出 44
  • call()

call() 方法調用一個函數,允許你顯式指定函數執行時的上下文(this),并且可以傳遞一系列參數作為函數的參數。立即執行函數。

const obj = {
  x: 42
};


function getX(y) {
  return this.x + y;
}


console.log(getX.call(obj, 2)); // 輸出 44
  • apply()

apply() 方法調用一個函數,允許你顯式指定函數執行時的上下文(this),同時傳遞一個數組或類數組對象作為函數的參數。立即執行函數。

const obj = {
  x: 42
};


function getX(y) {
  return this.x + y;
}


console.log(getX.apply(obj, [2])); // 輸出 44

區別總結:

  • 參數傳遞方式:

bind() 接受一系列參數,返回一個新函數。

call() 和 apply() 接受一個參數列表或數組作為參數。

  • 執行時機:
  • bind() 不會立即執行函數,而是返回一個新的綁定函數。
  • call() 和 apply() 立即執行函數。
  • 返回值:
  • bind() 返回一個新的函數。
  • call() 和 apply() 直接執行函數,并返回執行結果。

實現

下面是一個簡單的 bind 函數的實現,該實現基于了對 JavaScript 的原型鏈和閉包的理解:

Function.prototype.myBind = function (context) {
  const fn = this; // 保存原函數
  const args = Array.prototype.slice.call(arguments, 1); // 獲取除第一個參數(context)以外的所有參數
  return function () { // 返回一個函數,這個函數會被當做綁定后的函數調用
    const bindArgs = Array.prototype.slice.call(arguments); // 獲取 bind 方法的參數
    return fn.apply(context, args.concat(bindArgs)); // 在 context 上執行原函數,并傳入所有參數
  };
};


// 示例
const obj = {
  x: 42
};


function getX(y) {
  return this.x + y;
}


const boundGetX = getX.myBind(obj);
console.log(boundGetX(2)); // 輸出 44

在這個實現中,通過 Function.prototype 對象擴展了一個 myBind 方法。在 myBind 方法內部,首先保存了原函數 fn,然后提取除第一個參數(要綁定的上下文)之外的所有參數到 args 數組中。然后,我們返回了一個新的函數,這個函數會在指定的上下文 context 上執行原函數,并將原始的參數與綁定的參數合并起來傳遞給原函數。

責任編輯:武曉燕 來源: 海燕技術棧
相關推薦

2024-08-26 14:35:19

JavaScript關鍵字對象

2021-12-05 08:27:56

Javascript 高階函數前端

2024-08-20 16:04:27

JavaScript開發

2021-06-18 07:16:17

JavaScript apply()方法call()方法

2015-03-02 09:22:09

Javascript函數用法apply

2021-06-09 07:01:30

前端CallApply

2017-10-10 14:36:07

前端Javascriptapply、call、

2024-08-26 08:36:26

2021-12-01 06:40:32

Bind原理實現

2021-11-30 06:56:58

CallApply函數

2011-03-17 15:48:32

jQuery

2011-08-25 13:58:08

bind中文man

2022-07-13 09:00:06

BindNew 操作

2020-03-16 09:10:41

bindDNS服務器系統運維

2013-03-01 11:17:38

BIND10DNS

2011-03-22 09:49:15

JavaScript

2009-01-14 17:46:01

RHELBindDNS

2021-05-11 09:37:00

JsBind代碼

2009-07-30 15:09:44

asp.net中Bin

2021-05-12 10:46:23

漏洞BINDDNS服務器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品一区二区在线观看 | 毛片国产 | 99精品在线观看 | 国产一级一级 | 成人精品一区二区三区中文字幕 | 精品国产一区三区 | 欧美一a | 黄色大片网站 | 日韩成人免费视频 | 午夜视频在线 | 91中文字幕在线 | 蜜桃视频在线观看免费视频网站www | 国产精品美女久久久久aⅴ国产馆 | 伊人伊人 | 亚洲视频在线免费观看 | 久久久久久黄 | 欧美中国少妇xxx性高请视频 | 蜜桃免费一区二区三区 | 欧美激情精品久久久久 | 国产精品美女久久久久久免费 | 日韩精品免费 | 国产三级| 成人午夜视频在线观看 | 精品久久久久一区二区国产 | 国产精品一区二区三区免费观看 | 国产亚洲成av人在线观看导航 | 欧美日韩成人网 | av免费网站在线观看 | 久久久久久久亚洲精品 | 亚洲一区二区综合 | 一区二区三区四区在线免费观看 | 日韩久久久久久 | 在线一级片 | 久久精品a级毛片 | 久久专区 | av免费看片 | 亚洲精品无人区 | 天天久久 | 国产十日韩十欧美 | 日韩国产一区二区三区 | 黑人巨大精品欧美一区二区免费 |