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

why the result is inconsistent with expected in this decorate function?

本文关键字:不一致 函数 结果 为什么      更新时间:2023-09-26

这是一个链函数调用,我希望"--------"和下一个"--------"之间的所有输出块都应该完全相同,但当我尝试运行它时,输出的第一个块"-------"之间的内容与下面的所有输出区块不同?

前两行输出是:

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>

m的第一次调用发生在decoratefun(fun1)的调用内部。它将记录函数ffun1当前值,该值尚未重新分配为m

要"修复"此问题,请使用

function decoratefun (f){
    return function m(){
        console.log(f.toString());
        console.log(fun1.toString());
        console.log('--------');
        return m; 
    };
//   ^ no invocation here
}