解决JavaScript范围问题的替代方法

时间:2012-07-20 02:53:57

标签: javascript scope

截至目前,我一直在使用自动执行的匿名函数,以避免出现变量命名问题:

(function () {
    var a, b, c;
    a = 5;
    b = 10;
    c = 15;
    console.log('No problema!');
]());

我也知道使用onload函数也是一种替代方法:

window.onload = function () {
    var a;
    a = 25;
    console.log('Yay!!!');
}

但我真的不喜欢我的代码完全被困在一个函数中 - 我是否可以使用JavaScript对象来帮助我避免使用自执行函数?

2 个答案:

答案 0 :(得分:2)

在今天的大多数浏览器中,函数只是 封装的单位。如果要为变量创建范围,可以将其设置为函数的本地范围。

但是今天有许多服务器端JavaScript安装,模块存在,很多都基于require.js。如果你用Nodejs编写应用程序,你就会熟悉它。

尽管如此,下一版本的JavaScript即将推出。命名为ES6,ES.next,Harmony或JavaScript.next,这个新的JavaScript将包含用于隐藏信息的模块以及块范围。许多浏览器现在开始实现该语言的功能。您可以在http://repl.it以及其他地方进行试验。您可以使用Google的Traceur compiler将包含许多ES6提案的语言编译成今天的JavaScript。

TL; DR:目前:坚持浏览器中的功能。或者将require.js用于服务器端应用程序。坚持下去,因为ES6即将到来。

答案 1 :(得分:1)

var MyObject = (function() {
    var _variableHidden = 1;

    return {
        variableVisible: 2
    };
})();

MyObject.variableVisible //= 2
MyObject._variableHidden //= undefined

这称为“Reavealing Module Pattern”。它允许您使用作用域来隐藏变量,同时通过将属性和方法附加到返回的对象来使其可用。您可以在此处详细了解此模式及其他模式:http://addyosmani.com/resources/essentialjsdesignpatterns/book/#revealingmodulepatternjavascript

虽然这种方法不会删除“自执行”函数,但它确实允许您在向外部作用域提供内容时保持作用域和变量隐藏的增益。

我还应该注意到它们不是自动执行的功能。他们不会自己执行。我们实际上为他们这样做:)。哈哈,只是一个小小的烦恼。