一些簡單的Javascript操作中較少會用到call和apply函數,在另外一些較大型的操作中,如web應用開發,js框架開發中可能會經常遇到這兩個函數。關於這兩個函數的解釋,網路上的資料也很多,但是本人認為很多資料不是照本宣科,就是高度雷同,缺少接地氣的解釋。接下來我試著用更清晰簡單的思路來分析解釋這兩個函數。
我們可以將call()和apply()看做是某個物件的方法,透過呼叫方法的實行來間接呼叫函數。 call()和apply()的第一個實參是要呼叫函數的母對象,它是呼叫上下文,在函數體內透過this來獲得對它的參考。要對物件o的方法來呼叫函數f(), 可以這樣使用call()和apply(): f.call(o) f.apply(o).[1]
先來分析一下call,這裡有ECMAScript 3rd Edition對call函數的解釋[2]:當call方法被一個function物件呼叫時(func.call(0)),需要傳入一個必須的參數和若干個非必須的參數,它的執行過程是這樣的:
a, 如果呼叫call的物件是不可運作的,拋出一個TypeError錯誤。
b, 設定參數清單為空
c, 如果被呼叫的方法傳入不只一個參數,那麼依序把arg1,arg2…插入參數列表裡
d, 回傳呼叫call的函數結果,把呼叫函數(func)中的this用傳入的參數1替換,把傳入的參數列表當作這個函數的參數。
實際上,call函數是function物件的原型,也就是說,當呼叫call的函數必須也是個函數,當呼叫這個call時,把呼叫call的函數中的this用傳入的物件替換就行了。下面有個例子:
<script> function C1(){ this.name='张三'; this.age='24'; this.sayname=function(){ console.log("这里是C1类,我的名字是:"+this.name+"我的年龄是"+this.age); } } function C2(){ this.name='李四'; this.age='25'; } var c1=new C1(); var c2=new C2(); c1.sayname(); c1.sayname.call(c2); </script>
執行結果:
這裡是C1類,我的名字是:張三我的年齡是24
這裡是C1類,我的名字是:李四我的年齡是25
上面的程式碼中,宣告了兩個類,C1和C2,C1有兩個屬性,一個方法,C2也有兩個和C1一樣的屬性,實例化之後,c1.sayname()印出了實際屬性,c1 .sayname.call(c2)卻印出除了c2的屬性,為什麼為這樣?因為sayname()是個函數,而且函數體內有this,當call執行的之後,this就會被c2代替,所以,最後會印出c2的屬性。
apply和call的差別就在於可選參數的傳遞,apply的可選參數全部存放在一個數組當中,當成一個參數竄入而call是分成多個參數傳入。
那麼,apply和call函數有哪些應用呢?第一個是網路上比較經典的求數字數組中的最大元素,直接用Math.max.apply(null,array)即可,另外一個是可以用apply和call實現繼承,如下:
<script> function Human(name,sex){ this.name=name; this.sex=sex; this.walk=function(){ console.log('我在走路'); } } function Child(){ Human.call(this,"小明","男") this.paly=function(){ console.log('我很喜欢玩耍'); } this.intruduce=function(){ console.log('大家好,我是'+this.name); } } var jinp=new Human('Jack','男'); var xiaoping=new Child(); xiaoping.walk(); xiaoping.paly(); xiaoping.intruduce(); </script>
執行結果:
我在走路
我很喜歡玩耍
大家好,我是小明
與call()和apply()相似的函數是bind(), 它是在ECMAScript 5中新增的方法,但在ECMAScript 3中可以輕易的模擬bind()。 bind函數一樣也是Javascript中Function.prototype的方法,這個方法的主要內容是將函數綁定到某個物件。當函數f()上綁定bind()方法並傳入一個物件o作為參數,這個方法將會傳回一個新的函數當作o的方法來呼叫。傳入新函數的任何實參都會傳入原始函數。如下:
<script> function introduce(country,hobby){ return "大家好,我叫"+this.name+", 今年"+this.age+"岁, 来自"+country+", 喜欢"+hobby; } var xiaoming={name:"小明",age:20} var jieshao=introduce.bind(xiaoming); console.log(jieshao("中国","打球")); </script>
執行結果:
大家好,我叫小明, 今年20歲, 來自中國, 喜歡打球
上面的範例等效於:
<script> function introduce(country,hobby){ return "大家好,我叫"+this.name+", 今年"+this.age+"岁, 来自"+country+", 喜欢"+hobby; } var xiaoming={name:"小明",age:20} console.log(introduce.apply(xiaoming,["中国","打球"])); //或者下面这个 console.log(introduce.call(xiaoming,"中国","打球")); </script>
要注意的是:在ECMAScript 5的嚴格模式中,call()和apply()的第一個實參都會變成this的值,即使傳入的實參是原始值甚至是null或者undefined 。在ECMAScript 3和非嚴格模式中,傳入的null和undefined都會被全域對戲那個代替,而其他原始值會被對應的包裝物件所替代。
參考資料
[1], Javascript權威指南第6版,189頁
[2], Function.prototype.call (thisArg [ , arg1 [ , arg2, … ] ] )
[3], Function.prototype.apply (thisArg, argArray)

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3漢化版
中文版,非常好用

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

Dreamweaver CS6
視覺化網頁開發工具

Dreamweaver Mac版
視覺化網頁開發工具

SublimeText3 Linux新版
SublimeText3 Linux最新版