JavaScript设计模式 - 没有得到理想的结果

时间:2015-08-11 09:16:51

标签: javascript

我已将此代码剪断。我将a作为undefined。这不应该显示父函数中传递的参数值吗?

function test(a) {
    return function(a) {
        console.log('a is : ' + a); // Output: a is undefined
    }();
}

test('A should not be undefined? '); 

4 个答案:

答案 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
}