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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JS中apply和call的联系和区别

發布時間:2025/5/22 javascript 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JS中apply和call的联系和区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以下內容翻譯自stackoverflow

鏈接:

http://stackoverflow.com/questions/7238962/function-apply-not-using-thisarg-parameter

?

在AS3中,Method(方法)不同于Function(函數),Method是類的一部分,并且是和實例綁定【就是說這個類一旦實例化了,類里定義的Method會綁定這個實例】,看這個鏈接的第二部分關于Method,引用一部分:

?

Methods是類定義的functions(函數),一旦類實例化,method會綁定這個實例。函數可以聲明在類外,而方法不能脫離類而單獨使用。

?

所以,當我們創建一個MyObj類,類里所有方法綁定這個實例,這就是為什么當你想使用call或apply(的第一個參數),并沒有發現this(這個指針)被重新定向為新的對象。看Bound Methods的解釋細節。(隨后有時間翻譯一下bound methods)

?

看這個鏈接解釋traits object(有時間翻譯),actionscript 用來解決method,并用作背后可能會歸咎于的性能原因,這個traits object和類方法都僅僅是遵從ECMAScript模式的語法糖:

var TestClass = function(data) {var self = this;this.data = data;this.boundWork = function() {return self.constructor.prototype.unboundWork.apply(self, arguments);}; };TestClass.prototype.unboundWork = function() {return this.data; };

(上面的寫法,我認為是沒有加入語法糖的寫法,看起來要理解一番)

var a = new TestClass("a"); var b = new TestClass("b");alert(a.boundWork()); // a alert(b.boundWork()); // balert(a.unboundWork()); // a alert(b.unboundWork()); // balert(a.boundWork.call(b)); // a alert(a.boundWork.call(undefined)); // aalert(a.unboundWork.call(b)); // b

或更有趣的寫法:

var method = a.unboundWork; method() // undefined. ACK!

再來對比:

method = a.boundWork; method() // a. TADA MAGIC!

注意看boundWork的執行一直是服從于在它所屬的實例,不管你把this改成了什么對象,并用call和apply方法怎么調用。在ActionScript里,這種方式就解釋了為什么類里的方法是綁定于它的實例。所以不管這兩個方法在哪用,他們始終指向的都是他們所對應的實例(這和actionScript里的事件模型有點類似)。一旦你理解了,那么這種迂回的解決辦法就可以被理解了。(這里作者用到一個很有意思的詞work-around)

(解釋:work-around

中文解釋

雖不能根本解決, 但能避開問題的替代方法。

避免問題或困難而旁道而行達到目的。

權宜之計; 應急之策。

原本是電腦術語, 相對於「Fix」而言. 當一個程式有了問題, 找出問題所在然後直接解決它叫做「Fix」; 當問題始終無法解決, 於是想個方法忽略這個問題並使這個問題不致於影響你要用這程式達到的目的, 這樣的方法就叫 Workaround。

?

英文解釋

workaround means a manner of bypassing a problem caused by a bug without correcting the bug itself.

workaround is similar to "stopgap solution". If there is a problem, a "workaround" doesn‘t eliminate the problem, but it does bypass the problem.

)

(自己主觀理解:)

在某些地方,如果你既想需要在類里聲明方法,還想用這個方法做自己的事(改變這個方法所指的對象,就是重寫this一樣),(有空翻譯prototype function用法,用的有點抽象)你可以這樣寫:

package {import flash.display.Sprite; public class FunctionApplyTest extends Sprite{public function FunctionApplyTest(){var objA:MyObj = new MyObj("A");var objB:MyObj = new MyObj("B");objA.sayName();objB.sayName();objA.sayName.apply(objB, []); // aobjA.sayName.call(objB); // aobjA.pSayName.call(objB) // b <---}} }internal dynamic class MyObj {private var _name:String;public function MyObj(name:String){_name = name;} public function sayName():void{trace(_name);}prototype.pSayName = function():void {trace(this._name);}; }

上面代碼里,嚴重注意sayName和pSayName的區別,sayName一直和實例綁定的,但是pSayName就不同了,它既可被MyObj的實例利用,但又不會與特定的實例綁定。

轉載于:https://www.cnblogs.com/Unknw/p/6540054.html

總結

以上是生活随笔為你收集整理的JS中apply和call的联系和区别的全部內容,希望文章能夠幫你解決所遇到的問題。

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