關(guān)于Function中的bind()示例詳解
前言
bind()接受無(wú)數(shù)個(gè)參數(shù),第一個(gè)參數(shù)是它生成的新函數(shù)的this指向,比如我傳個(gè)window,不管它在何處調(diào)用,這個(gè)新函數(shù)中的this就指向window,這個(gè)新函數(shù)的參數(shù)就是bind()的第二個(gè)、第三個(gè)、第四個(gè)....第n個(gè)參數(shù)加上它原本的參數(shù)。(行吧,我自己都蒙圈了)
示例介紹
我們還是看看栗子比較好理解,舉個(gè)bind()最基本的使用方法:
this.x = 9;
var module = {
x: 81,
getX: function() { return this.x; }
};
module.getX(); // 返回 81
var retrieveX = module.getX;
retrieveX(); // 返回 9, 在這種情況下,"this"指向全局作用域
// 創(chuàng)建一個(gè)新函數(shù),將"this"綁定到module對(duì)象
// 新手可能會(huì)被全局的x變量和module里的屬性x所迷惑
var boundGetX = retrieveX.bind(module);
boundGetX(); // 返回 81
這里很明顯,我們?cè)趙indow對(duì)象下調(diào)用retrieveX,得到的結(jié)果肯定是window下的x,我們把module對(duì)象綁定到retrieveX的this上,問(wèn)題就解決了,不管它在何處調(diào)用,this都是指向module對(duì)象。
還有bind()的其他參數(shù),相信第一次接觸bind()的朋友看到上面的定義都會(huì)蒙圈。
還是舉個(gè)栗子:
function list() {
return Array.prototype.slice.call(arguments);
}
var list1 = list(1, 2, 3); // [1, 2, 3]
// 創(chuàng)建一個(gè)擁有預(yù)設(shè)初始參數(shù)的函數(shù)
var leadingThirtysevenList = list.bind(undefined,[69,37],{a:2});
var list2 = leadingThirtysevenList(); // [[69,37],{a:2}]
var list3 = leadingThirtysevenList(1, 2, 3); // [[69,37],{a:2}, 1, 2, 3]
list函數(shù)很簡(jiǎn)單,把傳入的每個(gè)參數(shù)插入到一個(gè)數(shù)組里,我們用bind()給list函數(shù)設(shè)置初始值,因?yàn)椴挥酶淖?code>list中this的指向,所以直接傳undefined,從第二個(gè)參數(shù)開始,就是要傳入list函數(shù)的值,list2和list3的返回值很好的說(shuō)明了一切。
我自己一般使用的bind()的場(chǎng)景是配合setTimeout函數(shù),因?yàn)樵趫?zhí)行setTimeout時(shí),this會(huì)默認(rèn)指向window對(duì)象,在使用bind()之前,我是這么做的:
function Coder(name) {
var that = this;
that.name = name;
that.getName = function() {
console.log(that.name)
};
that.delayGetName = function() {
setTimeout(that.getName,1000)
};
}
var me = new Coder('Jins')
me.delayGetName()//延遲一秒輸出Jins
在函數(shù)內(nèi)頂層定義一個(gè)that緩存this的指針,這樣不論怎么調(diào)用,that都是指向 Coder的實(shí)例,但是多定義一個(gè)變量總是讓人不太舒服。
使用bind()就簡(jiǎn)單多了:
function Coder(name) {
this.name = name;
this.getName = function() {
console.log(this.name)
};
this.delayGetName = function() {
setTimeout(this.getName.bind(this),1000)
};
}
var me = new Coder('Jins')
me.delayGetName()//延遲一秒輸出Jins
這樣就OK了,直接把setTimeout的this綁定到外層的this,這肯定是我們想要的!
最后附上參考地址:
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- 讓IE8瀏覽器支持function.bind()方法
- ie支持function.bind()方法實(shí)現(xiàn)代碼
- Function.prototype.bind用法示例
- javascript中的Function.prototye.bind
- 深入理解JS中的Function.prototype.bind()方法
- jQuery中的.bind()、.live()和.delegate()之間區(qū)別分析
- JQuery中綁定事件(bind())和移除事件(unbind())
- JQuery中Bind()事件用法分析
- jQuery事件綁定on()、bind()與delegate() 方法詳解
- 淺談javascript中call()、apply()、bind()的用法
相關(guān)文章
webpack-bundle-analyzer?插件配置使用方法
webpack-bundle-analyzer?是?webpack?的插件,需要配合?webpack?和?webpack-cli?一起使用,這篇文章主要介紹了webpack-bundle-analyzer?插件配置,需要的朋友可以參考下2023-02-02
JS實(shí)現(xiàn)讀取xml內(nèi)容并輸出到div中的方法示例
這篇文章主要介紹了JS實(shí)現(xiàn)讀取xml內(nèi)容并輸出到div中的方法,涉及javascript針對(duì)xml格式數(shù)據(jù)的讀取、遍歷、輸出等相關(guān)操作技巧,需要的朋友可以參考下2018-04-04
js實(shí)現(xiàn)完美兼容各大瀏覽器的人民幣大小寫相互轉(zhuǎn)換
在基于網(wǎng)頁(yè)的打印輸出或報(bào)表中,經(jīng)常會(huì)牽扯到金額的大寫,每次都打上去很麻煩,所以想法用一個(gè)JavaScript客戶端腳本來(lái)實(shí)現(xiàn)自動(dòng)轉(zhuǎn)換,只需在需要顯示大寫金額的時(shí)候調(diào)用該JS函數(shù),下面我們就來(lái)匯總下吧2015-10-10
js生成動(dòng)態(tài)表格并為每個(gè)單元格添加單擊事件的方法
這篇文章主要介紹了使用javascript生成動(dòng)態(tài)表格并為每個(gè)單元格添加單擊事件,需要的朋友可以參考下2014-04-04
使用validate.js實(shí)現(xiàn)表單數(shù)據(jù)提交前的驗(yàn)證方法
這篇文章主要介紹了使用validate.js實(shí)現(xiàn)表單數(shù)據(jù)提交前的驗(yàn)證方法,文中給大家提供了完整代碼,需要的朋友可以參考下2018-09-09
微信小程序?qū)崙?zhàn)之網(wǎng)易云音樂(lè)歌曲詳情頁(yè)實(shí)現(xiàn)代碼
本文給大家介紹了微信小程序?qū)W習(xí)記錄之網(wǎng)易云音樂(lè)歌曲詳情頁(yè)代碼實(shí)現(xiàn),代碼分為html、css和js部分,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
javascript實(shí)現(xiàn)一個(gè)數(shù)值加法函數(shù)
這篇文章主要介紹了javascript實(shí)現(xiàn)一個(gè)數(shù)值加法函數(shù),十分的簡(jiǎn)單實(shí)用,方便大家理解javascript,有需要的小伙伴可以參考下。2015-06-06

