我可以直接调用函数(我会以alert
为例),如此
alert("Hello World!"); // pops up an alert window
但是,当我在一个对象中放置一个函数时,调用它不再有效:
d = {func: alert};
d.func("Hello World!"); // doesn't do anything
d["func"]("Hello World!"); // also doesn't do anything
我想我可能需要明确传递一个空白this
参数,所以我尝试了
d.func(null, "Hello World!") // still nothing
但无济于事。有趣的是,这确实有效
d.func.apply(null, ["Hello World!"]); // success!
但这是无比冗长的,这让我的牙齿受伤了(引用JWZ)。是否有更简洁,不那么丑陋的方式?
答案 0 :(得分:4)
JavaScript中的函数按值传递。 alert()
函数是本机实现的,这意味着它没有JavaScript值。根据您的浏览器,本机包装器的平均值(原谅我)会有所不同。你的代码实际上可以在谷歌浏览器中使用,但在Firefox中不起作用,而且我会说它在Internet Explorer中也不起作用,这通常对修改本机对象不友好。功能。您可以使用以下代码:
d = {
func: function (message) {
alert(message);
}
};
答案 1 :(得分:3)
如果您尝试这样做:
function test(x) {
alert(x);
}
var x = {func: test}
x.func('Hi!');
它按预期工作。当我尝试直接向alert
执行此操作时,Firebug会给我以下错误消息:
[Exception... "Cannot modify properties of a WrappedNative"
nsresult: "0x80570034 (NS_ERROR_XPC_CANT_MODIFY_PROP_ON_WN)"
location: "JS frame :: http://stackoverflow.com/questions/859466/javascript-function-in-an-object-hash :: anonymous :: line 72" data: no]
所以我猜这是一个安全的东西,或者它与本机功能有关。
答案 2 :(得分:1)
我总是这样做:
var d = Object;
d.hello = function(msg) {
alert(msg)
};
d.hello('hello');
当然,您也可以使用PrototypeJS来获取所有面向对象的内容:
var Message = Class.create( {
display: function(msg) {
alert(msg);
}
});
var msg = new Message();
msg.display('hello');