对不起我的最后一个问题。这是格式更好的问题。
我有一个方法,我正在传递一个方法:
method("my_passed_method()")
function method(passed_method){
eval(passed_method.replace('()', + '(' + obj + ')' );
}
但这会返回:
SyntaxError: missing ] after element list
我假设这只是一些简单的 JSON 语法错误。
对不起我的最后一个问题。这是格式更好的问题。
我有一个方法,我正在传递一个方法:
method("my_passed_method()")
function method(passed_method){
eval(passed_method.replace('()', + '(' + obj + ')' );
}
但这会返回:
SyntaxError: missing ] after element list
我假设这只是一些简单的 JSON 语法错误。
我想你可能想要这个:
method(my_passed_method)
function method(passed_method){
passed_method(obj);
}
请注意,当您调用时method
,您传递的是函数引用,而不是字符串,并且您没有调用 my_passed_method
(()
它后面没有),您只是在引用它。
在method
中,您通过变量调用函数passed_method
,因为该变量包含函数引用。
在 JavaScript 中,函数是第一类对象。变量可以引用它们,你可以传递它们等等。
这是一个完整的、独立的示例:
// The function we'll pass in
function functionToPass(arg) {
display("functionToPass's arg is: " + arg);
}
// The function we pass it into
function functionReceivingIt(func) {
func("foo");
}
// Do it
functionReceivingIt(functionToPass);
方法的名称同时是您对该方法对象的引用。括号(可选地在它们之间带有参数)使 javascript 调用该方法。这意味着您的代码可以重写为:
method(my_passed_method)
function method(passed_method){
passed_method();
}
那么,这里发生了什么?当您传入 namemy_passed_method
时,javascript 引擎将查看该 name 映射到的内容,并发现它映射到一个 functio 对象。然后,在方法的函数调用中,该对象被分配给参数名称`passed_method。比,在这个名字后面加上括号会让 javascript 尝试执行那个对象,这确实是可能的,因为这个对象是一个函数,就像任何其他类型一样,函数就是我们所说的第一类公民。您可以通过将它们分配给变量并传递它们来像对待任何其他值一样对待它们。
eval
是邪恶的;或者他们说。您不需要将函数作为字符串传递,您可以只传递函数本身,然后使用Function.call
orFunction.apply
传递参数(或直接调用它):
method(my_passed_method);
function method(passed_method) {
passed_method(obj);
// OR: passed_method.call(window,obj);
}
必要的情况eval
非常罕见。
请注意,您的代码会将 obj 评估为 javascript,因此输出可能会有所不同。
在 Javascript 中,函数被视为对象。您可以将它们作为参数传递给其他函数,如下所示。
function something(x){
alert(x);
}
function pass(func){
pass2(func);
}
function pass2(func){
func("hello");
}
pass(something); //alerts hello
演示:http: //jsfiddle.net/wBvA2/