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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

js中bind、call、apply函数的用法

發布時間:2025/4/9 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 js中bind、call、apply函数的用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近一直在用?js?寫游戲服務器,我也接觸?js?時間不長,大學的時候用?js?做過一個 H3C 的?web?的項目,然后在騰訊實習的時候用?js?寫過一些奇怪的程序,自己也用?js?寫過幾個的網站。但真正大規模的使用?js?這還是第一次。我也是初生牛犢不怕虎,這次服務器居然拋棄?C++?和?lua?的正統搭配,而嘗試用?nodejs?來寫游戲服務器,折騰的自己要死要活的我也是醉了。

在給我們項目組的其他程序介紹?js?的時候,我準備了很多的內容,但看起來效果不大,果然光講還是不行的,必須動手。前幾天有人問我關于代碼里?call()?函數的用法,我讓他去看書,這里推薦用?js?寫服務器的程序猿看?《javascript編程精粹》?這本書,crockford大神果然不是蓋的。之后我在?segmentfault?上又看到了類似的問題,那邊解答之后干脆這里記一筆。


首先,關于?js?定義類或對象的方法,請參看?w3school 的這里,寫的非常詳細和清晰,我不再贅言了。


為了介紹?bind、call、apply?這三個函數的用法,不得不介紹?js?里函數的一些設定。關于這部分推薦通讀?《javascript編程精粹》?的第四章,這里我所說的在書里都能找到。

關于這三個函數的詳細介紹,可以參看 MDN 的文檔:bindcallapply


下面開始搬磚,修改自我之前在?segmentfault?上的答案:

js?里函數調用有 4 種模式:方法調用、正常函數調用、構造器函數調用、apply/call 調用。
同時,無論哪種函數調用除了你聲明時定義的形參外,還會自動添加 2 個形參,分別是?this?和?arguments。
arguments?不涉及到上述 3 個函數,所以這里只談?this。this?的值,在上面 4 中調用模式下,分別會綁定不同的值。分別來說一說:
方法調用:
這個很好理解,函數是一個對象的屬性,比如

1 2 3 4 5 6 7 var?a?=?{???? ????v?:?0,???? ????f?:?function(xx)?{???????????????? ????????this.v?=?xx;???? ????} } a.f(5);

這個時候,上面函數里的?this?就綁定的是這個對象?a。所以?this.v?可以取到對象?a?的屬性?v。

正常函數調用:
依然看代碼

1 2 3 4 function?f(xx)?{???????? ????this.x?=?xx; } f(5);

這個時候,函數?f?里的?this?綁定的是全局對象,如果是在瀏覽器運行的解釋器中,一般來說是?window?對象。所以這里?this.x?訪問的其實是?window.x?,當然,如果?window?沒有?x?屬性,那么你這么一寫,按照?js?的坑爹語法,就是給?window?對象添加了一個?x?屬性,同時賦值。

構造器函數調用
構造函數一直是我認為是?js?里最坑爹的部分,因為它和?js?最初設計的基于原型的面向對象實現方式格格不入,就好像是特意為了迎合大家已經被其他基于類的面相對象實現給慣壞了的習慣。
如果你在一個函數前面帶上?new?關鍵字來調用,那么?js?會創建一個?prototype?屬性是此函數的一個新對象,同時在調用這個函數的時候,把?this?綁定到這個新對象上。當然?new?關鍵字也會改變?return?語句的行為,不過這里就不談了。看代碼

1 2 3 4 function?a(xx)?{???????? ????this.m?=?xx; } var?b?=?new?a(5);

上面這個函數和正常調用的函數寫法上沒什么區別,只不過在調用的時候函數名前面加了關鍵字?new?罷了,這么一來,this?綁定的就不再是前面講到的全局對象了,而是這里說的創建的新對象,所以說這種方式其實很危險,因為光看函數,你不會知道這個函數到底是準備拿來當構造函數用的,還是一般函數用的。所以我們可以看到,在?jslint?里,它會要求你寫的所有構造函數,也就是一旦它發現你用了?new?關鍵字,那么后面那個函數的首字母必須大寫,這樣通過函數首字母大寫的方式來區分,我個人只有一個看法:坑爹:)

apply/call 調用:
我們知道,在?js?里,函數其實也是一個對象,那么函數自然也可以擁有它自己的方法,有點繞,在?js?里,每個函數都有一個公共的?prototype?——?Function,而這個原型自帶有好幾個屬性和方法,其中就有這里困惑的?bind、call、apply?方法。先說?apply?方法,它讓我們構造一個參數數組傳遞給函數,同時可以自己來設置?this?的值,這就是它最強大的地方,上面的 3 種函數調用方式,你可以看到,this?都是自動綁定的,沒辦法由你來設,當你想設的時候,就可以用?apply()?了。apply?函數接收 2 個參數,第一個是傳遞給這個函數用來綁定?this?的值,第二個是一個參數數組。看代碼

1 2 3 4 5 6 7 function?a(xx)?{???????? ????this.b?=?xx; } var?o?=?{}; a.apply(o,?[5]); alert(a.b);????//?undefined alert(o.b);????//?5

是不是很神奇,函數?a?居然可以給?o?加屬性值。當然,如果你?apply?的第一個參數傳遞?null,那么在函數?a?里面?this?指針依然會綁定全局對象。

call()?方法和?apply()?方法很類似,它們的存在都是為了改變?this?的綁定,那?call()?和?apply()?有什么區別呢?就我個人看來,沒啥鳥區別。。。開玩笑!剛剛說了,上面?apply()?接收兩個參數,第一個是綁定?this?的值,第二個是一個參數數組,注意它是一個數組,你想傳遞給這個函數的所有參數都放在數組里,然后?apply()?函數會在調用函數時自動幫你把數組展開。而?call()?呢,它的第一個參數也是綁定給 this 的值,但是后面接受的是不定參數,而不再是一個數組,也就是說你可以像平時給函數傳參那樣把這些參數一個一個傳遞。所以如果一定要說有什么區別的話,看起來是這樣的

1 2 3 4 5 6 7 function?a(xx,?yy)?{???? ????alert(xx,?yy);???? ????alert(this);???? ????alert(arguments); } a.apply(null,?[5,?55]); a.call(null,?5,?55);

僅此而已。

最后再來說?bind()?函數,上面講的無論是?call()?也好,?apply()?也好,都是立馬就調用了對應的函數,而?bind()?不會,?bind()?會生成一個新的函數,bind()?函數的參數跟?call()?一致,第一個參數也是綁定?this?的值,后面接受傳遞給函數的不定參數。?bind()?生成的新函數返回后,你想什么時候調就什么時候調,看下代碼就明白了

1 2 3 4 5 6 7 8 9 10 var?m?=?{??? ????"x"?:?1 }; function?foo(y)?{ ????alert(this.x?+?y); } foo.apply(m,?[5]); foo.call(m,?5); var?foo1?=?foo.bind(m,?5); foo1();

末了來個吐槽,你在?js?里想定義一個函數,于是你會這么寫:

1 function?jam()?{};

其實這是?js?里的一種語法糖,它等價于:

1 var?jam?=?function()?{};

然后你想執行這個函數,腦洞大開的你會這么寫:

1 function?jam()?{}();

但是這么寫就報錯了,其實這種寫法也不算錯,因為它確實是?js?支持的函數表達式,但是同時?js?又規定以?function?開頭的語句被認為是函數語句,而函數語句后面是肯定不會帶 () 的,所以才報錯,于是聰明的人想出來,加上一對括號就可以了。于是就變成了這樣:

1 (function?jam()?{}());

這樣就定義了一個函數同時也執行它,詳情參見?ECMAScript 的 Expression Statement 章節。


本文出自 “菜鳥浮出水” 博客,請務必保留此出處http://rangercyh.blog.51cto.com/1444712/1615809

轉載于:https://www.cnblogs.com/songchunmin/p/7789640.html

總結

以上是生活随笔為你收集整理的js中bind、call、apply函数的用法的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 手机看片福利视频 | 日韩欧美不卡视频 | 国产精品白嫩极品美女视频 | 五月天婷婷丁香 | 国产精品系列在线 | 中文字幕乱码中文乱码b站 国产一区二区三区在线观看视频 | 国产精品美女www | 欧美碰碰碰 | 99re国产| 久久综合av | av一二三区 | 亚洲资源网站 | www.夜夜| 在线免费观看日韩视频 | 欧美国产精品 | 99精品小视频 | 黄色av软件 | 动漫一区二区三区 | 日本视频免费在线播放 | 久久精品欧美日韩精品 | av大西瓜 | 骚虎视频最新网址 | 二区三区视频 | 久久精品国产亚洲av香蕉 | av网站免费看 | 91操操操 | 欧美少妇xxxxx | 伊朗做爰xxxⅹ性视频 | 日本高清不卡在线观看 | 国产v片| 激情五月激情综合网 | 国产视频xxx | 亚洲第一字幕 | 欧美日韩色视频 | 精品少妇 | 麻豆精品久久久 | 国产精品久久影视 | 久久久亚洲 | 国内自拍第三页 | 日本人妻丰满熟妇久久久久久 | 桃色成人网 | 美女免费网站 | 美女免费看片 | 亚洲国产精品无码专区 | 日本欧美另类 | 俺也去av | 男女做激情爱呻吟口述全过程 | 三浦惠理子aⅴ一二三区 | 91调教打屁股xxxx网站 | 欧美高清hd18日本 | 丝袜ol美脚秘书在线播放 | 99热这里只有精品1 亚洲人交配视频 | 国产专区第一页 | 在线观看国产 | 国产精品午夜在线观看 | 插插宗合网 | 天堂在线视频 | 99久久国| 久久人人妻人人人人妻性色av | 久久视频在线看 | 午夜激情成人 | 日韩精品一级 | 亚洲国产剧情 | 超碰99热| 成人精品在线看 | 国产精品婷婷午夜在线观看 | 欧美亚洲综合视频 | jizjiz中国少妇高潮水多 | 欧美资源在线观看 | 激情综合五月天 | 欧美成人乱码一区二区三区 | 精彩视频一区二区三区 | 亚洲电影一区二区三区 | 欧美黄色一级网站 | 天天色播 | 成人免费在线观看网站 | 国产乱人视频 | 深夜免费视频 | 另类天堂| 97视频在线免费 | 不卡日本视频 | 人妻av中文系列 | 激情四射av| 欧美色噜噜 | 久久国产99 | 国产精品无码免费播放 | 制服丝袜一区二区三区 | 久久久天天 | 麻豆免费在线观看 | 久久精品久久精品 | 日韩视频免费观看 | 春色影视 | 日韩不卡高清 | 老司机在线观看视频 | 伊人av综合 | 国语对白在线观看 | 亚洲国产成人无码av在线 | 成人国产一区二区三区精品麻豆 | 毛片基地在线观看 |