Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么可以';我是否直接引用document.createElement?_Javascript_Dom - Fatal编程技术网

Javascript 为什么可以';我是否直接引用document.createElement?

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_

当创建大量DOM元素时,document.createElement和friends可以添加大量字节和丑陋。我知道我可以制作自己的子例程,或者使用innerHTML或其他任何东西,但为什么我不能这样做:

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,不客气!您的短语还有一个更正确的术语:“将其从对象范围中释放”将是“失去引用的基本对象”。这与范围没有任何关系,它与和内部的工作方式有关。如果您感兴趣,可以在这里对该主题进行更广泛的解释: