为什么结果与此装饰函数中的预期不一致?

时间:2014-11-07 15:43:33

标签: javascript function firefox

这是一个链函数调用,我希望所有的输出块都在' --------'之间。然后' ---------'应该完全相同,但是当我尝试运行它时,第一个块之间的内容和#39; ------'输出的输出与以下所有输出块不同?

前两行输出是:

function(){alert('original')}
function(){alert('original')}
--------------

以下是:

function(){alert('original')}
function m(){
    console.log(f.toString());
    console.log(fun1.toString());
    console.log('--------');

    return m; 
}
--------------
.... (repeat)
--------------

代码如下:

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

        return m; 
    })();
}

var fun1 = decoratefun(fun1);

fun1()()()(); 
</script>

1 个答案:

答案 0 :(得分:1)

m的第一次调用发生在decoratefun(fun1)的调用中。它会记录f的函数fun1以及尚未重新分配为m的{​​{1}}的当前值。

要“修复”此项,请使用

function decoratefun (f){
    return function m(){
        console.log(f.toString());
        console.log(fun1.toString());
        console.log('--------');

        return m; 
    };
//   ^ no invocation here
}

代替