Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么';这些名称空间方法之间的区别是什么?_Javascript - Fatal编程技术网

Javascript 什么';这些名称空间方法之间的区别是什么?

Javascript 什么';这些名称空间方法之间的区别是什么?,javascript,Javascript,我是JavaScript新手,正在尝试了解如何使用名称空间来避免命名冲突。到目前为止,我发现创建名称空间最常用的两种方法是: 方法1: var MYAPPLICATION = { calculateVat: function (base) { return base * 1.21; }, product: function (price) { this.price = price; this.getPrice = funct

我是JavaScript新手,正在尝试了解如何使用名称空间来避免命名冲突。到目前为止,我发现创建名称空间最常用的两种方法是:

方法1:

var MYAPPLICATION = {
    calculateVat: function (base) {
        return base * 1.21;
    },
    product: function (price) {
        this.price = price;
        this.getPrice = function(){
                          return this.price;
                       };
    },
    doCalculations: function () {
        var p = new MYAPPLICATION.product(100);
        alert(this.calculateVat(p.getPrice()));
    }
}
var DED = (function() {

    var private_var;

    function private_method()
    {
        // do stuff here
    }

    return {
        method_1 : function()
            {
                // do stuff here
            },
        method_2 : function()
            {
                // do stuff here
            }
    };
})();
方法2:

var MYAPPLICATION = {
    calculateVat: function (base) {
        return base * 1.21;
    },
    product: function (price) {
        this.price = price;
        this.getPrice = function(){
                          return this.price;
                       };
    },
    doCalculations: function () {
        var p = new MYAPPLICATION.product(100);
        alert(this.calculateVat(p.getPrice()));
    }
}
var DED = (function() {

    var private_var;

    function private_method()
    {
        // do stuff here
    }

    return {
        method_1 : function()
            {
                // do stuff here
            },
        method_2 : function()
            {
                // do stuff here
            }
    };
})();

第二个方法允许您拥有私有方法和变量,因为只有返回的对象内部的内容才是全局可访问的,这有什么区别吗?以下哪种方法最好(或者有更好的方法)?

如果您为其他人编写API,我认为方法二更好。示例:jQuery

在网页中,我更喜欢方法一。示例:堆栈溢出


在方法2中,您不能读取和写入私有函数和变量,因此如果存在bug,您就不能通过开发人员工具读取用于调试的内容。

第二种方法称为“模块”模式。使开发人员能够轻松地使用您的代码。自调用函数创建作用域,所以您只需通过返回包含对这些方法的引用的对象(公共API)来公开要公开的方法。这些方法可以有很多私有的helper函数和变量,这些函数和变量是私有的,供您自己使用。大多数库都是这样编写的。这样构造你的库通常是好的。 这里有一个网站链接可以很好地解释这一点:

第一种方法就是将所有相关函数放在一起。你可以在你的模块中为个人使用。例子: 计算加(5,5)、计算减(3,2)、计算乘(3,3);
加、减、乘共享同一名称空间,因为它们是相关的

拥有不希望向调用者公开的函数和变量的能力确实是优势。在我看来,这是一个巨大的优势。第二种方法允许您拥有私有方法和变量,因为只有返回的对象内部的内容才是全局可访问的?是的。因此,我称之为“最佳”。首先,你要问的不是名称空间,而是范围/代码结构。第二,没有最好的:)我建议阅读abit以了解每种解决方案的优点。