1

试图从David Shariff 的博客中理解范围链执行上下文堆栈文章,我试图在这里理解闭包

function foo() {
    var a = 'private variable';
    return function bar() {
        alert(a);
    }
}

var callAlert = foo();
callAlert(); // private variable

我只是想测试内部函数是否仅具有来自其父级或整个作用域链的变量对象,因此我添加了一个重复该示例的嵌套函数:

function foo() {
    var a = 'private variable';
    return function bar() {
        return function foobar() {
            console.log(a);
        };
    };
}

var callAlert = foo();
callAlert();  //

这并没有给出任何结果。似乎解释器甚至没有进入foobar()函数。并且语法与其父级相同。

但如果我将函数声明和执行分开,它就会起作用。

function foo() {
    var a = 'private variable';
    return function bar() {
        function ra() {
            console.log(a);
        };
        return ra();
    };
}

var callAlert = foo();
callAlert(); // private variable

真的,我试图猜测为什么;bar()foobar()函数的区别在哪里。

PS - 我在JSFiddle上测试

4

1 回答 1

3
function foo() {
    var a = 'private variable';
    return function bar() {
        return function foobar() {
            console.log(a);
        };
    };
}

在这里,您要返回一个返回函数的函数,因此您需要调用那个新的、双重嵌套的函数

var callAlert = foo()();

演示

或该主题的任何变体

var getBar = foo();
var getFooBar = getBar();
getFooBar(); //private variable.

更新的演示


第二个示例运行良好,因为您仍然返回一个函数——一个简单调用另一个函数的函数。

return function bar() {
    function ra() {
        console.log(a);
    };
    return ra();
};
于 2013-12-10T19:00:10.873 回答