2010-10-11 76 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

相关问题