Javascript 为什么在这么多JS库中使用函数(全局、工厂)?
在如此多的JavaScript库中,我将Javascript 为什么在这么多JS库中使用函数(全局、工厂)?,javascript,Javascript,在如此多的JavaScript库中,我将全局、工厂视为函数的参数。 例如: jQuery: ( function( global, factory ) { "use strict"; if ( typeof module === "object" && typeof module.exports === "object" ) { //... Vue.js: (function (global, factory) { typeof exports ===
全局、工厂
视为函数的参数。例如: jQuery:
( function( global, factory ) {
"use strict";
if ( typeof module === "object" && typeof module.exports === "object" ) {
//...
Vue.js:
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global = global || self, global.Vue = factory());
}(this, function () { 'use strict';
/* */
// ...
可能还有更多的例子
我的问题是:
全局
和工厂
为什么经常用作参数?它们是什么?正如一些人在评论中提到的,真正的答案是这是UMD模块的结构。
我写这篇文章主要是为了回答这个问题,因为很难在评论中加以说明。但您可以在Vue.js示例中清楚地看到代码在做什么:
┌──────────────────┐ ┌──────────────────┐
│ ▼ ▼ │
│ (function (global, factory) { │
│ │
│ │
│ /* deleted for clarity */ │
│ ┌───────────────────────────┘
│ │
│ }(this, function () { 'use strict';
│ │
└───────┘
/* */
})
所以基本上它是一个。如果为匿名函数命名,则可以更清楚地重写此构造:
// rename function () { 'use strict' ...
function Vue () { 'use strict';
/* */
}
// rename function (global, factory) ...
function UMD (global, factory) {
/* deleted for clarity */
}
UMD(this, Vue);
因此,global
基本上是这个
当从任何函数外部引用时,它指向全局对象(浏览器中的窗口
,而不是在node.js中命名),而工厂
是一个创建Vue.js对象的函数(在jQuery的情况下是jQuery)。基本上,factory
是库的实现
此结构的编写方式不会在全局范围内创建任何不必要的变量或函数,从而避免污染全局范围,并避免变量/函数名称与其他库发生冲突
至于为什么它会将
这个
分配给全局
?这是因为window
在全局范围内是(曾经是?)一个完全不受保护的变量(这就是node.js没有给它命名的原因),任何第三方代码都可以用不同的东西覆盖或修改它。如果您想在使用未知第三方代码时使用浏览器的原始全局对象,则需要使用此此技巧。为了更好地理解slebetman answare,我创建了微型库
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
global.tinylib= factory();
} (this,function() {
// your code shoud place here
}))
这很简单,我创建了一个库
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports =
factory() :
typeof define === 'function' && define.amd ? define(factory) :
global.tinylib = factory();
} (this,function() {
-----------------------------------------mylibrary code start------------------
var tinylib= (function(el) {
var obj={}
var myelement=el
obj.setColor=(color)=>{
myelement.style.color=color;
}
return obj;
-----------------------------------------mylibrary code end------------------
})
return tinylib;
}))
创建的库的使用
import {tinylib} from 'tinylib'
初始化:
var lib=tinylib(document.getElementById('color')) //now we use lib variable whenever we want to invoke example showen below
用法:
lib.setColor('red')
这些特定的名称可能是某些模块绑定器的输出,但可以从“JavaScript UMD”中找到一个好的起点。这是标题您缺少一些代码来全面解释jQuery,但您可以清楚地看到factory
是函数(){'use strict';/**/…
@slebetman恐怕我不明白你想说什么。你可以在你自己的代码示例中看到,global
是这个
,而工厂
是函数(){…
。代码声明了一个函数,出于我们的目的,让我们给它命名foo
-函数foo(全局,工厂){…}
。然后它调用它foo(this,function(){'use strict'…
。但是它这样做时没有给它一个名称,就像我们那样,它看起来是这样:(function(全局,工厂){…}(this,function(){'use strict';…})
。它基本上是一个IIFEThanks,这很有意义。