Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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_Design Patterns_Namespaces_Module Pattern - Fatal编程技术网

Javascript 检查全局命名空间中是否存在不带备用名称的变量

Javascript 检查全局命名空间中是否存在不带备用名称的变量,javascript,design-patterns,namespaces,module-pattern,Javascript,Design Patterns,Namespaces,Module Pattern,作为Javascript设计模式的新手,我遇到了模块模式,但我没有得到名称空间方面的东西 在中,Addy解释了检查变量/命名空间是否存在的5种方法: // This doesn't check for existence of "myApplication" in // the global namespace. Bad practice as we can easily // clobber an existing variable/namespace with the same name v

作为Javascript设计模式的新手,我遇到了模块模式,但我没有得到名称空间方面的东西

在中,Addy解释了检查变量/命名空间是否存在的5种方法:

// This doesn't check for existence of "myApplication" in
// the global namespace. Bad practice as we can easily
// clobber an existing variable/namespace with the same name
var myApplication = {};

// The following options *do* check for variable/namespace existence. 
// If already defined, we use that instance, otherwise we assign a new 
// object literal to myApplication.
// 
// Option 1: var myApplication = myApplication || {};
// Option 2  if( !MyApplication ){ MyApplication = {} };
// Option 3: window.myApplication || ( window.myApplication = {} );
// Option 4: var myApplication = $.fn.myApplication = function() {};
// Option 5: var myApplication = myApplication === undefined ? {} : myApplication;
我真正不明白的是它是如何解决命名问题的

假设myApplication是在代码尝试使用myApplication之前设置的。例如,使用选项1(或者实际上使用所有选项),在myApplication已被使用的情况下,似乎不会改变任何内容,但只会覆盖myApplication以前的值:

// Higher in some script, where I don't know about it
var myApplication = 'whatever string or object used by the script';

// A bit of code later, where I come with my little Module Pattern
var myApplication = myApplication || {}; // Using Option 1

myApplication = (function($) {
   var myAppVariable = 'blabla';

   var myAppFunction = function() {
       // Doing a few things here
   };

   return myAppFunction;
}) (jQuery);

// Using the module
myApplication.myAppFunction();

对我来说,这是非常令人困惑的,因为我不明白这如何阻止我也踩到别人的脚。

当你用javascript加载一个模块时,你可能(取决于我猜的代码)不得不覆盖你模块名称空间中已经存在的任何变量。加载前保存模块名称的常用模式是
noConflict()
模式。此模式背后的思想是将名称空间的原始值保存在变量中,如果调用了
noConflict
,则用原始值替换名称空间并返回库。图案可以写得或多或少优雅,如下所示:

myModule=“some stuff ya”


是的,该模式不会保留原始的MyApplications,但您没有遵循该模式:您执行条件赋值,然后立即执行赋值,而无需检查。任务就是这样做的;如果你不做任何事情来避免践踏你的价值,你也不会做任何事情来避免践踏你的价值。具体的问题是什么?@dave newton我想具体的问题是,如果我的应用程序以前已经使用过(我认为这些选项应该会这样做),如何避免使用myApplication?有没有一个简短的方法来提供一个替代名称或什么的?这些选项可以做到这一点。然后你转身,通过直接赋值覆盖它。我不明白困惑是什么。@dave newton好的,那么我猜困惑是关于如何“不通过直接赋值来改变并覆盖它”,如何正确地完成赋值。
(function(namespace, undefined) {
    var _module = "myModule";
    var __originalModule = namespace[_module];//holds the original value in case you wish to restore it

    /****** Code your module here following whichever module pattern you wish to follow ****/
    var module = {
        log: function() {
            if(console.log) {
                console.log(arguments);
            }
        }
    }
    /****** End of your module ****/

    //calling this method will remove your module from the namespace and replace it with whatever
    // originally held your module name.
    //This function returns your module
    module.noConflict = function() {
        namespace[_module] = __originalModule;
        return module;
    }

    namespace[_module] = module; //add your module to the namespace

})(window);

console.log(window.myModule); // => {log: function...}
var myMod = window.myModule.noConflict();
console.log(window.myModule); // => "some stuff ya"