对不起我的上一个问题。这是更好格式化的问题。
我有一个方法,我通过一个方法:
method("my_passed_method()")
function method(passed_method){
eval(passed_method.replace('()', + '(' + obj + ')' );
}
但是这会回来:
SyntaxError: missing ] after element list
我假设这只是一些简单的JSON语法错误。
答案 0 :(得分:4)
我想你可能想要这个:
method(my_passed_method)
function method(passed_method){
passed_method(obj);
}
请注意,当您呼叫method
时,您传递的是函数引用,而不是字符串,而您调用 { {1}}(之后没有my_passed_method
),你只是指它。
在()
内,您可以通过变量method
调用该函数,因为该变量包含函数引用。
在JavaScript中,函数是第一类对象。变量可以引用它们,你可以传递它们等等。
这是一个完整的,自包含的例子:
passed_method
答案 1 :(得分:2)
方法的名称,同时是对该方法对象的引用。括号,可选地在它们之间具有参数,使javascript调用该方法。这意味着您的代码可以重写为:
method(my_passed_method)
function method(passed_method){
passed_method();
}
那么,这里发生了什么?
当您传入名称my_passed_method
时,javascript引擎将查看该名称映射到的内容,并发现它映射到functio对象。
在方法的函数调用中,该对象被赋值给参数名称`passed_method。比之,在这个名称后加上括号将使javascript尝试执行该对象,这确实是可能的,因为这个对象是一个函数,就像任何其他类型一样,函数就是我们称之为一流的citezens。您可以像处理任何其他值一样将它们分配给变量并传递它们。
答案 2 :(得分:0)
在Javascript函数中被视为对象。您可以将它们作为参数传递给其他函数,如下所示。
function something(x){
alert(x);
}
function pass(func){
pass2(func);
}
function pass2(func){
func("hello");
}
pass(something); //alerts hello
答案 3 :(得分:0)
eval
是邪恶的;或者他们说。您不需要将函数作为字符串传递,您只需传递函数本身,然后使用Function.call
或Function.apply
传递参数(或直接调用它):
method(my_passed_method);
function method(passed_method) {
passed_method(obj);
// OR: passed_method.call(window,obj);
}
需要eval
的情况非常罕见。
请注意,您的代码会将obj评估为javascript,因此输出可能会有所不同。