JavaScript在变量中保存document.write并调用它

时间:2011-10-19 19:42:54

标签: javascript

我正在尝试将document.write作为对变量的引用传递:

示例:

var f = document.write

//then
f('test');

它适用于警报。为什么它不适用于document.write

8 个答案:

答案 0 :(得分:10)

因为alert并不关心this是什么(alert是全局的)而document.write是什么(它需要知道它写入哪个文档) )。

如果你想要一个包装器,那就写一个快捷方式函数。

function f(str) { document.write(str); }

...然后去仪式上自己去取消变量fSelf-describing是良好代码的优点。

答案 1 :(得分:8)

除了已经说过的内容之外,Javascript 1.8.5还有针对此问题的原生解决方案:bind function

f = document.write.bind(document)
f("hello")

上面的链接还包含不支持JS 1.8.5的浏览器的仿真代码。

答案 2 :(得分:4)

某些函数(包括evaldocument.write)不能间接使用(即通过引用变量)。

如果您仍想使用document.write f,请使用:

function f(s){
    document.write(s);
}
f('test');

答案 3 :(得分:3)

为什么它不起作用我不能没有更多的研究,但要解决你的问题:

var f = function(i) { document.write(i); }

答案 4 :(得分:3)

我想这是因为你没有将f应用于文档(而是应用于窗口)

这有效:

var f = document.write;
f.call(document, "Hello world!!!");

答案 5 :(得分:2)

因为它在this函数中失去了write的正确值...

您可以将引用传递给document ...

var f = document;

f.write("hello");

或者像其他解决方案一样包装它。

答案 6 :(得分:2)

另一种奇怪的方法是:

var f = window.document.write;
f.call(window.document, "test")

或者:

var f = document.write;
f.apply(document, ["test"]);

答案 7 :(得分:1)

与此问题中发布的问题相同:Javascript Class Inheritance

正如其他人所说,你正在失去功能背景。函数是javascript中的任何其他对象。通过调用var f = document.write,您将获得对该函数的引用,但该函数没有对它所需的文档的引用。

示例:

// give the window a new funciton
window.foo = function () {
    console.log('FOO!);
}

// get a reference to this funciton
var fn = window.foo;

// call via reference works and outputs 'FOO!!' to the console
fn();

// attach it to your object
var myObject = {};
myObject.Foo = fn;

// call it it still works
myObject.Foo();

现在如果函数引用this,则上面的不起作用,因为this依赖于调用上下文。目前保存上下文的方法是使用这样的闭包......

// remember this is the window context

var fn = function (s) { 
    document.write(s);
}

上面代码工作的原因是javascript查看函数并且看不到本地document对象,因此它向上移动范围并查看外部作用域(在本例中为window对象)有一个文件和电话写在上面。实际上,对document.write()的调用与编写window.document.write()

相同