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

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

 更新時間:2016年10月11日 11:36:06   作者:子匠_Zijor  
bind 是 ES5 中新增的一個方法,可以改變函數內部的this指向。這篇文章小編將帶領大家深入理解Javascript中的Function.prototype.bind()方法。有需要的朋友們可以參考借鑒,下面來一起看看吧。

前言

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

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

一. bind的語法

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

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() 函數會創(chuàng)建一個新函數(稱為綁定函數),新函數與被調函數(綁定函數的目標函數)具有相同的函數體。當目標函數被調用時 this 值綁定到 bind() 的第一個參數,該參數不能被重寫。

1.2 原理

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

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

1.3 語法

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

二. bind的應用場景

2.1 實現(xiàn)對象繼承

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);
 }
};

// 事件處理函數綁定的錯誤方法:
document.querySelector('button')
 .addEventListener('click', paint.updateCount); // paint.updateCount函數的this指向變成了該DOM對象

// 事件處理函數綁定的正確方法:
document.querySelector('button')
 .addEventListener('click', paint.updateCount.bind(paint)); // paint.updateCount函數的this指向變成了paint

2.3 時間間隔函數

var notify = {
 text: "Hello World!",
 beforeRender: function() {
  alert(this.text);
 },
 render: function() {

  // 錯誤方法:
  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, // 保存原函數
   context = [].shift.call(arguments), // 需要綁定的this上下文
   args = [].slice.call(arguments); // 剩余的參數轉成數組
  return function() { // 返回一個新函數
   // 執(zhí)行新函數時,將傳入的上下文context作為新函數的this
   // 并且組合兩次分別傳入的參數,作為新函數的參數
   return self.apply(context, [].concat.call(args, [].slice.call(arguments))); 
  }
 };
}

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

共同點:

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

不同點:

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

總結

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家學習或者使用Javascript能有一定的幫助,如果有疑問大家可以留言交流。

相關文章

  • javascript閉包入門示例

    javascript閉包入門示例

    這篇文章主要介紹了多個javascript閉包入門示例,理解了這幾個例子,對于閉包,應該可以算是入門了,需要的朋友可以參考下
    2014-04-04
  • 深入理解JavaScript系列(48):對象創(chuàng)建模式(下篇)

    深入理解JavaScript系列(48):對象創(chuàng)建模式(下篇)

    這篇文章主要介紹了深入理解JavaScript系列(48):對象創(chuàng)建模式(下篇),本篇主要是介紹創(chuàng)建對象方面的模式的下篇,利用各種技巧可以極大地避免了錯誤或者可以編寫出非常精簡的代碼,需要的朋友可以參考下
    2015-03-03
  • JS中的this變量的使用介紹

    JS中的this變量的使用介紹

    在JavaScript中this變量是一個令人難以摸清的關鍵字,this可謂是非常強大,在本文將為大家詳細介紹下JavaScript中this的使用,感興趣的朋友可以參考下
    2013-10-10
  • JavaScript中將數組進行合并的基本方法講解

    JavaScript中將數組進行合并的基本方法講解

    這篇文章主要介紹了JavaScript中將數組進行合并的基本方法講解,包括快速合并多個數組的方法,需要的朋友可以參考下
    2016-03-03
  • JS中Object.assign方法的使用

    JS中Object.assign方法的使用

    這篇文章介紹了JS中Object.assign方法的使用方式,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • javascript使用window.open提示“已經計劃系統(tǒng)關機”的原因

    javascript使用window.open提示“已經計劃系統(tǒng)關機”的原因

    這篇文章主要介紹了javascript使用window.open提示“已經計劃系統(tǒng)關機”的原因,本文得出結論是安裝了系統(tǒng)更新或其它原因,要把系統(tǒng)重啟時才會提示這個問題,所以,遇到這個問題,重啟你的電腦吧
    2014-08-08
  • javascript代碼運行不出來執(zhí)行錯誤的可能情況整理

    javascript代碼運行不出來執(zhí)行錯誤的可能情況整理

    js代碼運行不出來的情況在項目中經常發(fā)生,究竟是什么原因呢?在本文整理了一些常見的情況,感興趣的各位朋友可以參考下
    2013-10-10
  • Json和Jsonp理論實例代碼詳解

    Json和Jsonp理論實例代碼詳解

    JSON是一種數據交換格式,而JSONP是一種依靠開發(fā)人員的聰明才智創(chuàng)造出的一種非官方跨域數據交互協(xié)議,本文從理論到實踐詳細的講解了JSON和JSONP的使用
    2013-11-11
  • YUI模塊開發(fā)原理詳解

    YUI模塊開發(fā)原理詳解

    這篇文章主要介紹YUI模塊化開發(fā)的原理,提供了代碼給大家學習參考使用
    2013-11-11
  • JavaScript開發(fā)規(guī)范要求(規(guī)范化代碼)

    JavaScript開發(fā)規(guī)范要求(規(guī)范化代碼)

    作為一名開發(fā)人員(WEB前端JavaScript開發(fā)),不規(guī)范的開發(fā)不僅使日后代碼維護變的困難,同時也不利于團隊的合作,通常還會帶來代碼安全以及執(zhí)行效率上的問題。
    2010-08-08

最新評論

建瓯市| 陈巴尔虎旗| 常德市| 青州市| 定襄县| 郁南县| 鄂托克前旗| 凤阳县| 正安县| 盐池县| 乡宁县| 淮南市| 老河口市| 眉山市| 霍林郭勒市| 宾阳县| 长沙市| 长乐市| 龙游县| 襄樊市| 抚州市| 奉化市| 建德市| 四子王旗| 乐平市| 石景山区| 彰化县| 宜章县| 图们市| 大名县| 嘉黎县| 湘潭市| 蓝田县| 漯河市| 高邑县| 大英县| 丰原市| 崇文区| 中方县| 旬阳县| 伊金霍洛旗|