IIFE内的可变范围

时间:2015-04-22 14:27:44

标签: javascript module-pattern

我是JS的新手。如果问题太天真,请原谅我。

我正在和这样的IIFE合作:

var App = (function() {

    var test = '';

    var init = function() {
        App.test = 'test';
    };

    return {
        init: init
    };

})();

如果我没有退回,为什么会暴露App.test?我以为只返回变量才会暴露(比如App.init)。而且,如何设置App.test的值而不暴露它?

通过公开它我的意思是可以在IIFE之外访问(即:浏览器控制台)

提前致谢!

2 个答案:

答案 0 :(得分:4)

您的App.test属性与该匿名函数中的局部变量test不同。它只是在您调用App.init()时创建的App对象的属性。

在任何对象上,代码通常可以随意创建属性,因此您也可以执行类似

的操作
App.favoriteColor = "blue";

现在,如果您尝试做的是将test变量作为私有数据存储保留在闭包中,那么您的init()函数应该直接引用它而不是指的是" App"对象:

var init = function() {
  test = 'test';
}

答案 1 :(得分:4)

运行App.init()后,App.test会有一个值,因为您在此处声明其值App.test = 'test';。我猜你想把它保存为私有变量,所以你可能想要这样做:

var App = (function() {

    var test = '';//this is private

    var init = function() {
        test = 'test';//private variable now!
    };

    return {
        init: init
    };

})();