带有从对象调用的参数的函数

时间:2012-05-17 08:18:30

标签: javascript

我是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()的结构应该是什么?

我在google上找不到任何有用的东西,因为说实话,我不确切知道我应该寻找什么。谢谢!

3 个答案:

答案 0 :(得分: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伪数组作为源数组(而不是提供的{{1复制除第一个之外的所有元素。

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

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

答案 1 :(得分:2)

你可以这样做:

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

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

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

答案 2 :(得分: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());
});