5

我对 Javascript 有点陌生,我被困在这一项上。有人可以告诉我如何使 javascript 变量只能在它所在的 .js 文件上使用。

例子:

假设我有两个 .js 文件,PG1 和 PG2。PG1 包含 var channel = Channel01;

PG2 包含一个同名的变量,但输入的变量不同(等号后面的部分)(var channel = Channel02)

我不希望 PG1 上的 function1 使用 PG2 上的变量或 PG2 上的 function2 使用 PG1 上的变量。

我还从单独的 HTML 页面调用这些函数。

问题:我的所有函数最终都只使用一个变量,无论它们在哪个页面上。(例如,function1 和 function2 都使用 var channel = channel01)

问题:如何将 page1 上的函数限制为仅使用该 .js 页面上的变量

谢谢!

4

4 回答 4

9

将整个内容包装在立即调用函数表达式中,这将有效地为文件提供自己的范围

(function() {
   // Your file's contents live here.
})();
于 2012-05-17T23:36:45.147 回答
8

模块模式:

var myModule = (function(exports){

    var x = "foo";

    exports.myFunction = function(){
        alert(x);
    };

})(typeof exports!="undefined" && exports instanceof Object ? exports : window );

myFunctionwindow在浏览器的范围内可用。

编辑

我引用作者的话:“我也从一个单独的 HTML 页面调用这些函数。”

所以作者需要全局访问他定义的函数。

虽然不需要 var myModule ,也不需要 export ,它只是为了与 AMD 兼容:

(function(exports){

    var x = "foo";

    exports.myFunction = function(){
        alert(x);
    };

})(window);

现在 x for myFunction 只存在于闭包中,但 myFunction 仍然可以在全局范围内访问 x。全局范围内的任何 x 定义或任何范围都不会影响x = "foo"

于 2012-05-17T23:38:08.870 回答
4

如果您实际上不需要将任何变量公开到全局范围,则可以将整个 JavaScript 代码包装在立即调用的函数表达式或 IIFE 中。在这里,您定义了一个匿名函数表达式并立即调用它。结果是,不是用变量污染全局范围,而是在该函数的本地范围内保持它们的整洁。

(function() {
    var channel = Channel01;

    // Put the rest of your PG1 code here, for example:

    function init() {
        channel.open();
    }

    init();
})();

然后,您可以以类似的方式将您的 PG2 代码包装在 IIFE 中。结果将是这两个脚本除了已定义的全局变量(例如Channel01和)之外不共享任何变量Channel02

于 2012-05-17T23:46:45.600 回答
1

虽然不是您问题的直接答案,但这是相关且重要的,因为错过它可能会污染其他模块。如果您不使用 var 关键字,则该变量位于全局范围内,即

(function () {
   x = 'foo'; //x is on the global scope and can be seen everywhere
})()

(function () {
   var y = 'bar'; //y is local to this function
})()

我希望我没有重复上面任何人所说的,但我看不到它提到

于 2014-01-07T16:47:27.043 回答