对象/哈希中的Javascript函数

时间:2009-05-13 18:04:39

标签: javascript function

我可以直接调用函数(我会以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)。是否有更简洁,不那么丑陋的方式?

3 个答案:

答案 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');