2015-06-21 66 views
4

我經常這樣做,那JsFunction.apply不會像我所期望的那樣工作。考慮下面這個例子:JsFunction.apply不工作,而JsObject.callMethod確實工作(飛鏢)

import "dart:js"; 
import "dart:html"; 

void main() { 
    var div = querySelector('div'); 
    var span = new SpanElement()..text = "hello world"; 
    var js = new JsObject.fromBrowserObject(div); 
    js["appendChild"].apply([span]); 

    // this one does work: 
    // js.callMethod("appendChild", [span]); 
} 

我預計js["appendChild"].apply([span]);工作完全一樣js.callMethod("appendChild", [span]);

另見本演示:https://dartpad.dartlang.org/0f35d76a3c61ba1371f1

回答

4

它與js["appendChild"].apply([span], thisArg: js);

如果你不提供thisArg這就像你打電話Function.prototype.applynull作爲第一個參數。

因此,你的飛鏢調用是一樣的JS:

var div = document.querySelector('div'); 
var span = document.createElement("span"); 
span.innerText = "hello world"; 
div["appendChild"].apply(null, [span]); 

上面的js代碼的執行導致TypeError: Illegal invocation。爲了使它工作,你必須使用div["appendChild"].apply(div, [span]);

所以這不是一個飛鏢問題,而是一個js問題。