-->

如何跨越多个文件中的JavaScript命名空间?(How to span javascript n

2019-07-29 00:37发布

我已经永远忽略的JavaScript。 我开始使用jQuery在几年前,我就可以得到通过。 但正如我开始做TDD多个昨天我决定要真正深入到JavaScript(以及可能的CoffeeScript后)。

在我的ASP.NET Web窗体应用程序,我有很多页,目前最这些页面的不具有大量的JavaScript。 我在这变化的过程。 我使用的茉莉花与放肆创建我的测试。

我连同我的测试及格和不及格预期移动。 但后来我想创建一个命名空间,所以我不会被践踏遍布全球的空间。

看完这篇文章后: http://enterprisejquery.com/2010/10/how-good-c-habits-can-encourage-bad-javascript-habits-part-1/

我决定尝试使用来自自执行匿名函数的模式:部分文章2(公共和私人)部分。 它似乎有最大的灵活性,并显示封装的东西非常好。

我有一个名为/脚本文件夹中。 该文件夹下有一些我正在使用像jQuery,茉莉,(Twitter)上的引导程序和Modernizr的框架中。 我也有一个名为/子文件夹中的网站,我把我的代码在基于页面的多个文件的网站。 (product.js,billing.js等)

在/脚本/网站我添加了一个子文件夹有文件(product_test.js,billing_tests.js等)/测试(或规格)。

无需命名空间,一切都很好。 我有我有padLeft辅助函数创建一个utility.js文件。 然后我用的是全球padLeft在另一个.js文件。 我的测试中所有的工作,我很高兴。 于是我决定找出命名空间和改变了我的脚本/网站/ utility.js的样子:

(function (myns, $, undefined) {
    //private property
    var isSomething = true;

    //public property
    myns.something = "something";

    //public method
    myns.padLeft = function (str, len, pad) {
        str = Array(len + 1 - str.length).join(pad) + str;

        return str;
    };


    //check to see if myns exists in global space
    //if not, assign it a new Object Literal
}(window.myns= window.myns|| {}, jQuery ));

然后在我的脚本/网站/测试/ utility_test.js我有

/// <reference path="../utility.js" />

describe("Namespace myns with public property something", function () {
    it("Should Equal 'something'", function () {
        expect(myns.something).toEqual('something');
    });
});

有了这个非常简单的测试,我期待myns.something然后再回来的“东西”的字符串值。

事实并非如此。 它回来不确定的

所以,我怎么使用在多个文件中的JavaScript命名空间?

对不起,长的介绍,但我想它可能有助于解释为什么在我做这种方式。 我也把所有这一切,因为我愿意听到此设置如何是完全错误的或部分错误或任何想法。

感谢您抽出时间来阅读这个问题的时候。

UPDATE:解决谢谢大家的帮助。 最帮助来自于评论者@TJ克劳德。 我不知道jsbin工具存在,是确信,我把上面的代码被放入工具,结果是正确的,我知道的东西在我的环境是关闭后。

在接受答案的链接也帮了我很多。 看到的语法和逻辑是一致的,工作后我不得不决定是什么了关于我的设置。 我不好意思说这是我传递的jQuery但在我的测试工具,我一直想把这个我没有实际使用jQuery工作。 这意味着实际上并没有被加载的模块 - 所以myns名字从未设置过。

感谢大家。 希望这可能是有帮助的人的未来。 如果您使用上述确保您包括jQuery对象。 另一种选择是不是在jQuery的通过,并移除帕拉姆列表中的$。

Answer 1:

尝试把你的名字空间声明中的函数调用的外部:

myns = window.myns || {};
(function(myns, $, undefined) {
    ...
}(myns, jQuery));

您现有的语法似乎是完全有效的,但打破了线路输出可以帮助找出与您的变量范围走错了。



Answer 2:

JavaScript没有命名空间,我想你有可变范围烦恼与此类似,其他语言,你所谈论的对象。 你可以使用

window.myns.something

第一个功能已经加入你的对象到窗口对象,窗口对象是从任何地方访问。



文章来源: How to span javascript namespace across multiple files?