我已将此代码剪断。我将a
作为undefined
。这不应该显示父函数中传递的参数值吗?
function test(a) {
return function(a) {
console.log('a is : ' + a); // Output: a is undefined
}();
}
test('A should not be undefined? ');
答案 0 :(得分:5)
只需从闭包中删除a
参数:
function test(a) {
return function() {
// ^^
console.log('a is : ' + a);
}();
}
There are much better explanations available than this,但我会给它一个去:test
返回一个“捕获”它所在的环境(或范围)的函数(闭包),包括所有变量,以及把它们带走。因为您正在向该函数传递一个参数,所以console.log期待它。但是因为它是一个立即调用的函数,你需要将a
传递给函数(就像Aravinder在他/她的答案中所示),或者不需要,并且只允许闭包使用{{1从父函数“传递给它”。
希望这很有用。
公平地说,这不是你经常遇到的模式(或者,至少,我没有)。你更有可能看到这样的东西。此处a
是一个包含bob
的函数,因为a
在调用a
时与闭包一起返回。
test
答案 1 :(得分:3)
您应该将变量a作为返回自调用函数的参数传递。
看一下这段代码:
function test(a) {
return function(a) {
console.log('a is : ' + a);
}(a);
}
test('A should not be undefined? ');
答案 2 :(得分:2)
问题是a
中的console.log
是(匿名)内部函数的参数,它掩盖了外部函数之一。通过在lambda演算中重命名内部函数的参数( α-conversion )可以更清楚地说明这一点:
function test(a) {
return function(b) {
console.log('b is : ' + b); // Output: b is undefined
}();
}
test('A should not be undefined? ');
正如@andy所建议的,最简单的解决方案是从内部函数中删除参数。外部函数中的绑定仍然可见,因此将使用它。
答案 3 :(得分:1)
当您描述新函数时,a
代表内部作用域中的局部变量,该变量隐藏传递给a
方法的test
。
与以下内容相同:
function test(a) {
return function(a_inner) {
console.log('a_inner is : ' + a_inner);
}(); // <--- here
}
创建一个函数后,你可以不带参数调用它(参见注释&#34;这里&#34;) - 这个内部a
是未定义的。您可以将a
作为参数传递,以获得所需的输出:
function test(a) {
return function(a) {
console.log('a is : ' + a);
}(a); // <--- and again, here. it works now
}