匿名函数如何传递参数

时间:2013-11-12 16:48:41

标签: javascript anonymous-function

我一直在玩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')时,我是否打电话给第一个测试,我的意思是:
测试=(功能(arg)...
或者我运行了Test(str)函数?
如果我实际上正在运行第一个测试,它是如何将Tata传递给它内部的功能测试的? 最后,当我打电话给Test('tata')时,为什么它没有记录到另一个时间?

3 个答案:

答案 0 :(得分: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()语句,该字符串是通过连接创建函数(“titi”)时传递的参数“arg”的值来构建的(“tata” “)。
  9. 因此,在步骤5中返回的函数“记住”“titi”参数,因此对该函数的任何调用都将导致字符串“titi”被添加。

答案 1 :(得分:2)

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

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

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

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

Test('tata');

答案 2 :(得分: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`