如何在其他功能中使用 fn 作为功能参数?
而且, fn 参数具有自参数。比如test("b('aa')")
,怎么办?
JAVASCRIPT
<script type="text/javascript">
function test(fn){
if(fn){
fn();
}
}
function a(){
alert(1);
}
function b(x){
alert(x);
}
/*
when click I get errors => TypeError: fn is not a function
*/
</script>
HTML
<button onclick="test('a')">test('a')</button>
<button onclick="test('b(hello)')">test('b(hello)')</button>
答案 0 :(得分:2)
因为'a' IS 真实,但它不是一个功能。这应该有效:
<button onclick="test(a))">test('a')</button>
此外,您的测试条件不应为if(fn){
,而应为:
if(typeof fn === 'function'){
你可以这样的方式执行b:
<button onclick="test(b.bind(null, 'hello'))">test('b(hello)')</button>
这会将b
函数传递给test
并将'hello'绑定为其第一个参数
答案 1 :(得分:1)
只需写下来。
<script type="text/javascript">
function test(fn,parameter){
if(fn){
fn.apply(window,parameter||[]);
}
}
function a(){
alert(1);
}
function b(x){
alert(x);
}
/*
when click I get errors => TypeError: fn is not a function
*/
</script>
<button onclick="test(a)">test('a')</button>
<button onclick="test(b,['hello'])">test('b(hello)')</button>
感谢Felix Kling的评论。这是解释。
NOT 正确,因为'b(hello)'是一个字符串对象。
test('b("hello")')
不正确,因为你得到的实际上是b('hello')的返回值,这是未定义的。
test(b('hello'))
要将参数发送到功能测试,必须将fn和参数分开。
您可以使用Function.prototype.apply( thisValue , argumentsList )。
正如我所写,
fn.apply(window,parameter||[])
fn函数的 此 值是默认窗口。
parameter
是<button>test('b(hello)')</button>
元素中['hello']的参数列表。
||[]
阻止未定义的变量。 test(a)
是没有实现参数的示例。
答案 2 :(得分:1)
使用jQuery,您可以代理参数而无需更改函数:
<button onclick="test(a)" />
<button onclick="test($.proxy(b,window,'hello')" />
或者在功能中你可以测试b的艺术
if (x.arity>0){
x(arguments[1])
}
并点击test(b,'hello');