Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/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 允许用户为JavsScript库定义另一个别名_Javascript - Fatal编程技术网

Javascript 允许用户为JavsScript库定义另一个别名

Javascript 允许用户为JavsScript库定义另一个别名,javascript,Javascript,我创建了一个JavaScript库,其代码如下所示 问题:如果使用此库的开发人员已经创建了一个名为xyz的变量,那么我如何允许开发人员根据此处提到的代码为库定义另一个别名?现在,如果发生这种情况,我会在浏览器的控制台中打印一条有用的消息,以便让开发人员知道重复的名称 库代码 (function (window) { function define_library() { //code for JavaScript library that has been omitted }

我创建了一个JavaScript库,其代码如下所示

问题:如果使用此库的开发人员已经创建了一个名为
xyz
的变量,那么我如何允许开发人员根据此处提到的代码为库定义另一个别名?现在,如果发生这种情况,我会在浏览器的控制台中打印一条有用的消息,以便让开发人员知道重复的名称

库代码

(function (window) {

    function define_library() {
     //code for JavaScript library that has been omitted
}
if (typeof (xyz) === 'undefined') {
        window.xyz = define_library();
    }
    else {
        console.log("'xyz' is already defined. Library/variable is already defined.");
    }
})(window);
可能是
define\u library
方法需要作为公共方法公开,以便开发人员可以使用以下代码为库创建另一个别名,但不确定在这种情况下的最佳做法

开发人员在其项目中为库使用另一个别名

window.abc = define_library();

有朝一日,您将能够将库发布为JavaScript模块(今年的新功能,ES6的一部分),这将不再是您的问题

同时,有几种不同风格的异步模块定义(AMD)库(如RequireJS),您可以添加对它们的支持

if (typeof require !== "undefined") {
    // Do RequireJS stuff
} else if (typeof exports !== "undefined") {
    // Set your top-level library functions on exports
} else {
    // ...
}
如果所有其他方法都失败了,jQuery的方法()相当聪明:它获取它将要编写的全局变量的前一个值,并提供一种方法将该值设置回原来的值。在您的情况下,它可能如下所示:

(function(window) {
    var original_xyz = window.xyz;

    // ...your normal stuff...

    // A method that releases the symbol:
    window.xyz.noConflict = function() {
        window.xyz = original_xyz;
        return this;
    };

})(window);
然后使用它的人:

<script src="your_library.js"></script>
<script>
var abc = xyz.noConflict();
</script>

您可以通过允许使用JS代码的开发人员编辑JS代码来实现这一点。在本例中,您可以提供一个返回值,该值可能存储在任何变量中

var moduleGlobalName = 'xyz';

(function( global ) {
    global[moduleGlobalName] = function define_library() {
        // code for JavaScript library that has been omitted
    }
})( window, moduleGlobalName || 'xyz' );

但我建议您使用AMD模块(如我在上面的评论中所建议的),并使用适当的模块加载器,如。

这就是您不应在全局范围内创建函数和变量的原因。使用某种JS模块将代码封装到一个模块中,该模块可以加载任何名称。关于为不同模块加载器(例如Require.JS、CommonJS、jQuery插件)提供JS的介绍,请参阅@feeela:Nifty链接,这是我的阅读列表。因此,开发人员可以使用您的方法使用
abc
作为库名,只需编写以下代码:
var abc=xyz.noConflict()