这个代码块中javascript中变量的作用域有什么问题? var fun1=函数(){alert('original')}; 函数decoratefun(f){ 返回函数(){ log(f.toString()); log(fun1.toString()); console.log('--------------'); 返回decoratefun.apply(这是参数); }; } var fun1=decoratefun(fun1); fun1();//这很有效 fun1()();//但事实并非如此,它抱怨“f”未定义

这个代码块中javascript中变量的作用域有什么问题? var fun1=函数(){alert('original')}; 函数decoratefun(f){ 返回函数(){ log(f.toString()); log(fun1.toString()); console.log('--------------'); 返回decoratefun.apply(这是参数); }; } var fun1=decoratefun(fun1); fun1();//这很有效 fun1()();//但事实并非如此,它抱怨“f”未定义,javascript,scope,chain,Javascript,Scope,Chain,为什么fun1()上的链调用会给出类似f未定义的错误?我已经使用arguments对象传递了f,为什么第二个调用说f未定义?这对我来说有点奇怪,我认为f仍然在fun1()的链式调用范围内,那么为什么解释器会抱怨呢 我已经使用arguments对象传递了'f',为什么第二个调用说'f'没有定义 arguments指从decoratefun返回的匿名函数的参数: <script> var fun1 = function(){alert('original')}; function dec

为什么
fun1()
上的链调用会给出类似
f
未定义的错误?我已经使用arguments对象传递了
f
,为什么第二个调用说
f
未定义?这对我来说有点奇怪,我认为
f
仍然在
fun1()
的链式调用范围内,那么为什么解释器会抱怨呢

我已经使用arguments对象传递了'f',为什么第二个调用说'f'没有定义

arguments
指从
decoratefun
返回的匿名函数的参数:

<script>
var fun1 = function(){alert('original')};
function decoratefun (f){
    return function(){
        console.log(f.toString());
        console.log(fun1.toString());
        console.log('-------------');

        return decoratefun.apply(this,arguments); 
    };
}

var fun1 = decoratefun(fun1);

fun1(); // this works
fun1()(); // but this doesn't, it complains 'f' is undefined
</script>
正如您所看到的,调用函数(
fun1()
)时,这不会定义任何参数,也不会向它传递任何参数。因此,您最终调用了
decoratefun.apply(这是参数)
而没有任何参数,这就是为什么
f
未定义的。您可以通过添加
console.log(参数)
来验证这一点

如果您将一个函数传递给
fun1
,它将起作用

return function(){

};
但是,我相信您只是想直接通过
f

fun1(fun1);

或者,我想如果他想保留所有参数,即使他添加了更多参数,他也可以在匿名函数上方添加一个“var tempArguments”,并使用它。好发现!我想不出来。
return decoratefun.call(this, f);