我正在尝试将document.write
作为对变量的引用传递:
示例:
var f = document.write
//then
f('test');
它适用于警报。为什么它不适用于document.write
?
答案 0 :(得分:10)
因为alert
并不关心this
是什么(alert
是全局的)而document.write
是什么(它需要知道它写入哪个文档) )。
如果你想要一个包装器,那就写一个快捷方式函数。
function f(str) { document.write(str); }
...然后去仪式上自己去取消变量f
。 Self-describing是良好代码的优点。
答案 1 :(得分:8)
除了已经说过的内容之外,Javascript 1.8.5还有针对此问题的原生解决方案:bind function
f = document.write.bind(document)
f("hello")
上面的链接还包含不支持JS 1.8.5的浏览器的仿真代码。
答案 2 :(得分:4)
某些函数(包括eval
和document.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()