这个代码块中javascript的变量范围有什么问题?

时间:2014-11-07 14:41:17

标签: javascript scope chain

<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()上的链调用会给出f之类的错误?我使用arguments对象传递了f,为什么第二个调用说f未定义?这对我来说有点奇怪,我认为f仍然在fun1()的链调用范围内,所以为什么翻译会抱怨?

1 个答案:

答案 0 :(得分:1)

  

我使用arguments对象传递'f',为什么第二个调用'f'未定义?

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

return function(){

};

正如您所看到的,当您调用函数(fun1())时,这不会定义任何参数,也不会向其传递任何参数。因此,您最终在没有任何参数的情况下调用decoratefun.apply(this,arguments),这就是fundefined的原因。您可以通过添加console.log(arguments)来验证这一点。

如果您将函数传递给fun1,例如

,它将起作用
fun1(fun1);

但是,我相信您只想直接传递f

return decoratefun.call(this, f);