Javascript 为什么可以';我是否直接引用document.createElement?
当创建大量DOM元素时,document.createElement和friends可以添加大量字节和丑陋。我知道我可以制作自己的子例程,或者使用innerHTML或其他任何东西,但为什么我不能这样做:Javascript 为什么可以';我是否直接引用document.createElement?,javascript,dom,Javascript,Dom,当创建大量DOM元素时,document.createElement和friends可以添加大量字节和丑陋。我知道我可以制作自己的子例程,或者使用innerHTML或其他任何东西,但为什么我不能这样做: var $c = document.createElement; var newP = $c('p'); Firebug抱怨此消息: "Illegal operation on WrappedNative prototype object" nsresult: "0x8057000c (NS_
var $c = document.createElement;
var newP = $c('p');
Firebug抱怨此消息:
"Illegal operation on WrappedNative prototype object" nsresult: "0x8057000c (NS_ERROR_XPC_BAD_OP_ON_WN_PROTO)"
很明显,我做了一些不被允许的事情。为什么不是呢?允许使用其他内容,例如Array.splice或Math.min。调用它的方式会导致
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"
我想我明白了。执行
fn=obj.method
将method
方法指定给全局fn
变量,“将其从对象范围中释放”。因此,在我的示例中,document
的范围丢失,这就是控制台抱怨的原因。这是正确的吗?如果是这样的话,为什么Math.min和Array.splice在对它们执行此操作时不抱怨呢?@Rafael,对,使用Math
方法不会发生这种情况,因为它们是“静态”的,它们在内部不使用this
值。关于“Array.splice
”,我想你说的是Mozilla的,这些方法也是“静态的”,但请记住它们不是ECMAScript标准的一部分,它们仅在Mozilla实现中可用<代码>Array.splice!=Array.prototype.splice,将所有内容清除。非常感谢您的明确解释。@Rafael,不客气!您的短语还有一个更正确的术语:“将其从对象范围中释放”将是“失去引用的基本对象”。这与范围没有任何关系,它与和内部的工作方式有关。如果您感兴趣,可以在这里对该主题进行更广泛的解释: