javascript
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(這個指針)被重新定向為新的對象??碆ound 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的联系和区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++设计模式:Template Met
- 下一篇: oracle 中关于null的操作