我一直在玩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')时,为什么它没有记录到另一个时间?
答案 0 :(得分:2)
您的匿名函数返回内部函数“Test”。 console.log("toto")
调用不在该函数内。
调用返回的函数不会再次调用匿名函数。然而,你的内在功能保留了传入的“arg”值的“记忆”,这就解释了为什么它会记录“titi tata”。
那么,一步一步发生的是:
return
语句,函数退出时引用内部函数“Test”。console.log()
语句,该字符串是通过连接创建函数(“titi”)时传递的参数“arg”的值来构建的(“tata” “)。因此,在步骤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`