日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

聊聊Function的bind()

發布時間:2024/4/14 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 聊聊Function的bind() 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

bind顧名思義,綁定。

bind()方法會創建一個新函數,當這個新函數被調用時,它的this值是傳遞給bind()的第一個參數,它的參數是bind()的其他參數和其原本的參數。

上面這個定義最后一句有點繞,我們來理一下。

bind()接受無數個參數,第一個參數是它生成的新函數的this指向,比如我傳個window,不管它在何處調用,這個新函數中的this就指向window,這個新函數的參數就是bind()的第二個、第三個、第四個....第n個參數加上它原本的參數。(行吧,我自己都蒙圈了)

我們還是看看栗子比較好理解,舉個bind()最基本的使用方法:

this.x = 9; var module = {x: 81,getX: function() { return this.x; } };module.getX(); // 返回 81var retrieveX = module.getX; retrieveX(); // 返回 9, 在這種情況下,"this"指向全局作用域// 創建一個新函數,將"this"綁定到module對象 // 新手可能會被全局的x變量和module里的屬性x所迷惑 var boundGetX = retrieveX.bind(module); boundGetX(); // 返回 81

這里很明顯,我們在window對象下調用retrieveX,得到的結果肯定是window下的x,我們把module對象綁定到retrieveX的this上,問題就解決了,不管它在何處調用,this都是指向module對象。

還有bind()的其他參數,相信第一次接觸bind()的朋友看到上面的定義都會蒙圈。

還是舉個栗子:

function list() {return Array.prototype.slice.call(arguments); }var list1 = list(1, 2, 3); // [1, 2, 3]// 創建一個擁有預設初始參數的函數 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函數很簡單,把傳入的每個參數插入到一個數組里,我們用bind()給list函數設置初始值,因為不用改變list中this的指向,所以直接傳undefined,從第二個參數開始,就是要傳入list函數的值,list2和list3的返回值很好的說明了一切。

我自己一般使用的bind()的場景是配合setTimeout函數,因為在執行setTimeout時,this會默認指向window對象,在使用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

在函數內頂層定義一個that緩存this的指針,這樣不論怎么調用,that都是指向 Coder的實例,但是多定義一個變量總是讓人不太舒服。

使用bind()就簡單多了:

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,這肯定是我們想要的!

行吧,先聊這么多,堅持學習!

最后附上參考地址:

Function.prototype.bind()

轉載于:https://www.cnblogs.com/chinajins/p/5987608.html

總結

以上是生活随笔為你收集整理的聊聊Function的bind()的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。