2

我一直在玩 javascript 函数,但我一直在理解一段代码的流程:让我们举个例子

Test = (function(arg) {
    function Test(str) {
        console.log(arg + ' ' + str);
    }

    console.log('toto');

    return Test;
})()

所以,如果我运行这个,我会得到'toto',很好!现在如果这样做:

Test = (function(arg) {
        function Test(str) {
            console.log(arg + ' ' + str);
        }

        console.log('toto');

        return Test;
    })('titi')
Test('tata');

我去拿:

toto
titi tata

这是怎么发生的,当我写Test('tata')时,我是否调用了第一个Test,我的意思是:
Test =(function(arg)......
或者我运行了函数Test(str)?
如果我是实际运行第一个测试,它是如何将 Tata 传递给其中的函数 Test 的?
最后,为什么当我调用 Test('tata') 时它没有记录到另一个时间?

4

3 回答 3

2

您的匿名函数返回内部函数“Test”。该console.log("toto")调用不在该函数内。

调用返回的函数不会再次调用匿名函数。但是,您的内部函数保留了传入的“arg”值的“记忆”,这就解释了为什么它记录“titi tata”。

所以,一步一步发生的事情是:

  1. 声明了变量“Test”;
  2. 匿名函数被调用。
  3. 内部函数“Test”是在匿名函数的本地上下文中定义的。
  4. 执行“toto”日志语句。
  5. return语句被执行,函数退出并引用内部函数“Test”。
  6. 返回值分配给外部上下文中的变量“Test”。
  7. 返回的函数通过外部“Test”变量中的引用调用,参数是字符串“tata”。
  8. 运行返回函数中的console.log()语句,使用一个字符串,该字符串是通过将创建函数时的“arg”值(“titi”)与传入的参数(“tata”)连接起来的。

因此,第 5 步中返回的函数“记住”了“titi”参数,因此对该函数的任何调用都将导致字符串“titi”被添加到前面。

于 2013-11-12T16:50:38.737 回答
2

innerTest是一个新函数,与初始函数无关Test。此外,您已经返回了它,但是它在其闭包内保持了arg它的值。titi

当您分配Test时,它输出“toto”,但从不运行内部Test函数,因此在调用您的函数之前您看不到“titi” Test('tata'),然后调用内部返回的函数,该函数最初将“arg”保存为“titi”。

如果你想考虑它是如何运行的,你实际上会得到这个(其中Test分配了内部函数,并将 'titi' 保存为arg):

Test = function(str) {
  console.log('titi' + ' ' + str);
}
console.log('toto');

Test('tata');
于 2013-11-12T16:56:12.457 回答
1

让我们稍微分析一下您的代码:

完整代码(稍作编辑):

TestO = (function(arg) {
    function TestI(str) {
        console.log(arg + ' ' + str);
    }

    console.log('toto');

    return TestI;
})()

外部:

TestO = function(arg) { ... } (/* 0 parameters */)

测试被初始化为使用 0 参数调用的匿名函数的返回值。

内部功能:

function TestI(str) {
    console.log(arg + ' ' + str); outer function
}

arg是传递给外部函数的参数的值。它是可用的,因为关闭。

外功能体

console.log('toto'); 
return TestI; // this value will be passed to TestO

此代码在您调用匿名外部函数时执行,而不是 TestO,而不是 TestI。初始化 TestO 时调用外部函数。

结论

初始化 TestO 时调用匿名外部函数,记录“toto”并使用 TestI 函数初始化 TestO(这也是arg匿名外部函数参数的闭包)。

TestO('tata') // calls TestI with the closured value of `arg` as `arg` and 'tata' as `str`
于 2013-11-12T17:03:23.590 回答