2

我是 javascript 新手,我正在尝试一些不同的东西。以下面的例子为例:

function obj(){
    this.execute = function(codeToExecute){
        codeToExecute();
    }
}

// Object init and function call

var obj = obj();
obj.execute(function(){
    alert("G'Day!");
}

这将执行alert消息。到目前为止一切都很好,但现在我正在尝试alert通过参数传输的消息:

var obj = obj();
obj.execute(function(message){
    alert(message);
}

function obj()现在我必须在某处插入该参数的结构应该是什么?

我在谷歌上找不到任何有用的东西,因为老实说我不知道​​我应该寻找什么。谢谢!

4

3 回答 3

4

您可以扩展execute,以便将任何其他参数传递给提供的函数:

function Obj() {
    this.execute = function(f) {
        var args = [].slice.call(arguments, 1);
        f.apply(this, args);
    }
}

var obj = new Obj();
obj.execute(function(message){
    alert(message);
}, "boo!");

这条线是“神奇”的一条:

var args = [].slice.call(arguments, 1);

它使用Array.prototype.slice用于复制数组的函数,但是(有点)欺骗函数使用arguments伪数组作为源数组(而不是提供的[]),复制除第一个元素之外的所有元素。

您不能只使用它arguments.slice(1),因为arguments它不是真正的JS 数组。它有一个.length属性,您可以访问arguments[n],但它没有prototype真正数组所具有的所有额外功能。虽然它的实现.slice()并不好,但它已经足够接近了。

注意:您应该使用new创建一个对象实例 - 在您的原始代码中,您只是立即调用 obj(),然后将(未定义的)结果重新分配回obj- 该代码根本不可能工作。

于 2012-05-17T08:20:57.853 回答
2

你可以这样做:

function obj(){
 this.execute = function(codeToExecute, arg){
     codeToExecute(arg);
   }
} 

var obj = new Obj(); 
obj.execute(function(message){
               alert(message);},
           "yourmessage");

本质上,您将 2 个参数传递给 obj.execute:函数和该函数的参数。

于 2012-05-17T08:28:55.930 回答
1

您可以使用良好的旧 set/get 方法。下面我将消息传递到对象构造函数中,并且可以使用getMessage函数访问它。如果您不想传递给构造函数,可以包含一个 set 函数

function Obj(message){
this.getMessage = function(){
return message;
}
    this.execute = function(codeToExecute){
        codeToExecute();
    }
}

var obj = new Obj("hello");
obj.execute(function(){
    alert(obj.getMessage());
});
于 2012-05-17T08:38:52.697 回答