传递一个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); }