国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

深入理解JS中的Function.prototype.bind()方法

2019-11-20 08:47:02
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

對(duì)于函數(shù)綁定(Function binding)很有可能是大家在使用JavaScript時(shí)最少關(guān)注的一點(diǎn),但是當(dāng)你意識(shí)到你需要一個(gè)解決方案來(lái)解決如何在另一個(gè)函數(shù)中保持this上下文的時(shí)候,你真正需要的其實(shí)就是 Function.prototype.bind() ,只是你有可能仍然沒有意識(shí)到這點(diǎn)。

第一次遇到這個(gè)問(wèn)題的時(shí)候,你可能傾向于將this設(shè)置到一個(gè)變量上,這樣你可以在改變了上下文之后繼續(xù)引用到它。

一. bind的語(yǔ)法

bind() 方法的主要作用就是將函數(shù)綁定至某個(gè)對(duì)象,bind() 方法會(huì)創(chuàng)建一個(gè)函數(shù),函數(shù)體內(nèi)this對(duì)象的值會(huì)被綁定到傳入bind() 函數(shù)的值。

1.1 定義

bind()的定義如下:

The bind() method creates a new function that, when called, has its this keyword set to the provided value, with a given sequence of arguments preceding any provided when the new function is called.

bind() 函數(shù)會(huì)創(chuàng)建一個(gè)新函數(shù)(稱為綁定函數(shù)),新函數(shù)與被調(diào)函數(shù)(綁定函數(shù)的目標(biāo)函數(shù))具有相同的函數(shù)體。當(dāng)目標(biāo)函數(shù)被調(diào)用時(shí) this 值綁定到 bind() 的第一個(gè)參數(shù),該參數(shù)不能被重寫。

1.2 原理

可以用如下代碼模擬bind()的原理:

Function.prototype.bind = function(context) { var self = this; // 保存原函數(shù) return function() { // 返回一個(gè)新函數(shù)  return self.apply(context, arguments); // 執(zhí)行新函數(shù)時(shí),將傳入的上下文context作為新函數(shù)的this }}

1.3 語(yǔ)法

Function.prototype.bind(thisArg[, arg1[, arg2[, ...]]])

二. bind的應(yīng)用場(chǎng)景

2.1 實(shí)現(xiàn)對(duì)象繼承

var A = function(name) { this.name = name;}var B = function() { A.bind(this, arguments);}B.prototype.getName = function() { return this.name;}var b = new B("hello");console.log(b.getName()); // "hello"

2.2 事件處理

var paint = { color: "red", count: 0, updateCount: function() {  this.count++;  console.log(this.count); }};// 事件處理函數(shù)綁定的錯(cuò)誤方法:document.querySelector('button') .addEventListener('click', paint.updateCount); // paint.updateCount函數(shù)的this指向變成了該DOM對(duì)象// 事件處理函數(shù)綁定的正確方法:document.querySelector('button') .addEventListener('click', paint.updateCount.bind(paint)); // paint.updateCount函數(shù)的this指向變成了paint

2.3 時(shí)間間隔函數(shù)

var notify = { text: "Hello World!", beforeRender: function() {  alert(this.text); }, render: function() {  // 錯(cuò)誤方法:  setTimeout(this.beforeRender, 0); // undefined  // 正確方法:  setTimeout(this.beforeRender.bind(this), 0); // "Hello World!" }};notify.render();

2.4 借用Array的原生方法

var a = {};Array.prototype.push.bind(a, "hello", "world")();console.log(a); // "hello", "world"

三. bind()方法的瀏覽器兼容性

四. bind()的兼容性寫法

if (!Function.prototype.bind) { Function.prototype.bind = function() {  var self = this, // 保存原函數(shù)   context = [].shift.call(arguments), // 需要綁定的this上下文   args = [].slice.call(arguments); // 剩余的參數(shù)轉(zhuǎn)成數(shù)組  return function() { // 返回一個(gè)新函數(shù)   // 執(zhí)行新函數(shù)時(shí),將傳入的上下文context作為新函數(shù)的this   // 并且組合兩次分別傳入的參數(shù),作為新函數(shù)的參數(shù)   return self.apply(context, [].concat.call(args, [].slice.call(arguments)));   } };}

五. bind與 call/apply方法的區(qū)別

共同點(diǎn):

都可以改變函數(shù)執(zhí)行的上下文環(huán)境;

不同點(diǎn):

bind: 不立即執(zhí)行函數(shù),一般用在異步調(diào)用和事件; call/apply: 立即執(zhí)行函數(shù)。

總結(jié)

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家學(xué)習(xí)或者使用Javascript能有一定的幫助,如果有疑問(wèn)大家可以留言交流。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 垫江县| 时尚| 宣化县| 城口县| 仙游县| 龙州县| 托克托县| 江门市| 甘肃省| 青冈县| 平邑县| 乐昌市| 灵山县| 沐川县| 宜州市| 溧水县| 五家渠市| 雷波县| 准格尔旗| 门源| 淮安市| 石渠县| 周至县| 乌拉特中旗| 土默特左旗| 凌源市| 奉新县| 鄂州市| 天门市| 闸北区| 乌拉特后旗| 邹平县| 抚松县| 汾阳市| 玉屏| 固镇县| 万源市| 萨嘎县| 汉阴县| 西吉县| 榆林市|