2010-10-11 75 views
3

當創建大量的DOM元素時,document.createElement和朋友可以添加大量的字節和醜陋。我知道我可以讓我自己子程序,或者使用innerHTML或什麼,但爲什麼我就不能做到這一點:爲什麼我不能直接引用document.createElement?

var $c = document.createElement; 
var newP = $c('p'); 

螢火蟲抱怨此消息:

"Illegal operation on WrappedNative prototype object" nsresult: "0x8057000c (NS_ERROR_XPC_BAD_OP_ON_WN_PROTO)" 

顯然,我已經做了不允許的東西。爲什麼不是?它允許其他事物,例如Array.splice或Math.min。

+0

如果烏爾位數的這個subjet更廣泛的解釋是這裏:http://stackoverflow.com/questions/1007340/javascript-function-aliasing-doesnt-seem-to-work – 2011-06-05 16:23:49

回答

8

您調用它的方式會導致createElement方法中的this值引用全局對象。

我會建議您只需使用功能:

var $c = function (tagName) { return document.createElement(tagName); }; 
var newP = $c('p'); 

我說話可以用一個例子來說明行爲:

var foo = 'global foo'; 

var obj = { 
    foo: "I'm obj.foo", 
    method: function() { 
    return this.foo; 
    } 
}; 


var fn = obj.method; 

obj.method(); // "I'm obj.foo" 
fn();   // "global foo" 
+0

我想我明白了。執行'fn = obj.method'會將'method'方法賦值給全局'fn'變量,將其從對象的範圍中「釋放」。所以在我的例子中,'document'的範圍丟失了,這就是控制檯抱怨的原因。它是否正確?如果是這樣,爲什麼Math.min和Array.splice在對它們做這些事情時抱怨? – Rafael 2010-10-11 21:59:18

+1

@Rafael,用'Math'方法不會發生,因爲它們是*「static」*,它們在內部不使用'this'值。關於「'Array.splice'」,我想你是在談論Mozilla的[「Array Generics」](https://developer.mozilla.org/en/New_in_JavaScript_1.6#Array_and_String_generics),那些方法也是*「static 「*,但請記住,它們*不是* ECMAScript標準的一部分,它們僅在Mozilla實現中可用...'Array.splice!= Array.prototype.splice' – CMS 2010-10-11 22:10:13

+0

清除了所有內容。非常感謝您的明確解釋。 – Rafael 2010-10-11 22:21:32

相關問題