传递一个JavaScript函数作为参数

如何将函数作为parameter passing,而不在“父”函数中执行函数或使用eval() ? (因为我读过它是不安全的。)

我有这个:

 addContact(entityId, refreshContactList()); 

它的工作原理,但问题是refreshContactList函数被调用时触发,而不是在函数中使用。

我可以使用eval()来解决这个问题,但根据我读到的,这不是最好的做法。 我如何在JavaScript中传递一个函数作为参数?

你只需要删除括号:

 addContact(entityId, refreshContactList); 

这然后传递函数而不是先执行它。

这里是一个例子:

 function addContact(id, refreshCallback) { refreshCallback(); // You can also pass arguments if you need to // refreshCallback(id); } function refreshContactList() { alert('Hello World'); } addContact(1, refreshContactList); 

如果你想传递一个函数,只需要在没有括号的情况下引用它:

 function foo(x) { alert(x); } function bar(func) { func("Hello World!"); } //alerts "Hello World!" bar(foo); 

但有时你可能想要传递一个带有参数的函数,但是在调用callback之前不要调用它。 要做到这一点,在调用它时,只需将其包装在一个匿名函数中,如下所示:

 function foo(x) { alert(x); } function bar(func) { func(); } //alerts "Hello World!" (from within bar AFTER being passed) bar(function(){ foo("Hello World!") }); 

如果你愿意,你也可以使用apply函数,并有第三个参数是参数数组,如下所示:

 function eat(food1, food2) { alert("I like to eat " + food1 + " and " + food2 ); } function myFunc(callback, args) { //do stuff //... //execute callback when finished callback.apply(this, args); } //alerts "I like to eat pickles and peanut butter" myFunc(eat, ["pickles", "peanut butter"]); 

例1:

 funct("z", function (x) { return x; }); function funct(a, foo){ foo(a) // this will return a } 

例2:

 function foodemo(value){ return 'hello '+value; } function funct(a, foo){ alert(foo(a)); } //call funct funct('world!',foodemo); //=> 'hello world!' 

看这个

要传递函数作为参数,只需删除括号!

 function ToBeCalled(){ alert("I was called"); } function iNeedParameter( paramFunc) { //it is a good idea to check if the parameter is actually not null //and that it is a function if (paramFunc && (typeof paramFunc == "function")) { paramFunc(); } } //this calls iNeedParameter and sends the other function to it iNeedParameter(ToBeCalled); 

这背后的想法是一个函数是非常类似于一个variables。 而不是写作

 function ToBeCalled() { /* something */ } 

你也可以写

 var ToBeCalledVariable = function () { /* something */ } 

两者之间有一些细微的差别,但无论如何 – 它们都是定义函数的有效方式。 现在,如果你定义了一个函数并明确地把它分配给一个variables,那么你可以把它作为parameter passing给另一个函数,而且你不需要括号:

 anotherFunction(ToBeCalledVariable); 

JavaScript程序员之间有一句话:“Eval是邪恶的”,所以尽量避免它!

除了史蒂芬芬顿的回答,你也可以直接传递函数。

 function addContact(entity, refreshFn) { refreshFn(); } function callAddContact() { addContact("entity", function() { DoThis(); }); } 

我build议将参数放在一个数组中,然后使用.apply()函数将它们分开。 所以现在我们可以轻松地传递一个带有很多参数的函数,并以一种简单的方式执行它。

 function addContact(parameters, refreshCallback) { refreshCallback.apply(this, parameters); } function refreshContactList(int, int, string) { alert(int + int); console.log(string); } addContact([1,2,"str"], refreshContactList); //parameters should be putted in an array 

那个问题我把所有的头发都砍掉了。 我不能使上面的例子工作,所以我结束了:

 function foo(blabla){ var func = new Function(blabla); func(); } // to call it, I just pass the js function I wanted as a string in the new one... foo("alert('test')"); 

这就像一个魅力…至less我需要什么。 希望它可以帮助一些。

你也可以使用eval()来做同样的事情。

 //A function to call function needToBeCalled(p1, p2) { alert(p1+"="+p2); } //A function where needToBeCalled passed as an argument with necessary params //Here params is comma separated string function callAnotherFunction(aFunction, params) { eval(aFunction + "("+params+")"); } //A function Call callAnotherFunction("needToBeCalled", "10,20"); 

而已。 我也在寻找这个解决scheme,并试着在其他答案中提供的解决scheme,但最后得到它从上面的例子工作。

这是另一种方法:

 function a(first,second) { return (second)(first); } a('Hello',function(e){alert(e+ ' world!');}); //=> Hello world 

其实看起来好像有点复杂,不是。

获取方法作为参数:

  function JS_method(_callBack) { _callBack("called"); } 

你可以给一个参数方法:

  JS_method(function (d) { //Finally this will work. alert(d) }); 

其他答案在描述发生的事情方面做得非常出色,但是一个重要的“陷阱”是要确保你所传递的任何东西的确是对函数的引用。

例如,如果你通过一个string而不是一个函数,你会得到一个错误:

 function function1(my_function_parameter){ my_function_parameter(); } function function2(){ alert('Hello world'); } function1(function2); //This will work function1("function2"); //This breaks! 

见JsFiddle

您也可以使用JSON来存储和发送JS函数。

检查以下内容:

 var myJSON = { "myFunc1" : function (){ alert("a"); }, "myFunc2" : function (functionParameter){ functionParameter(); } } function main(){ myJSON.myFunc2(myJSON.myFunc1); } 

这将打印“a”。

以下与上面的效果相同:

 var myFunc1 = function (){ alert('a'); } var myFunc2 = function (functionParameter){ functionParameter(); } function main(){ myFunc2(myFunc1); } 

这与以下内容也有相同的效果:

 function myFunc1(){ alert('a'); } function myFunc2 (functionParameter){ functionParameter(); } function main(){ myFunc2(myFunc1); } 

而一个使用Class作为对象原型的对象范例:

 function Class(){ this.myFunc1 = function(msg){ alert(msg); } this.myFunc2 = function(callBackParameter){ callBackParameter('message'); } } function main(){ var myClass = new Class(); myClass.myFunc2(myClass.myFunc1); }