我刚开了Retina.js希望学到一些东西,但我在第一行难倒。
var root = (typeof exports === 'undefined' ? window : exports);
这条线到底是做什么的?
再往下,
function Retina() {}
root.Retina = Retina;
如果没有首先定义Retina属性,它是如何设置出来的呢?
答案 0 :(得分:2)
typeof
是一个运算符,当用于一个根本没有定义的变量时,仍然会得到值'undefined'
。所以表达式:
(typeof exports === 'undefined' ? window : exports)
检查exports
是否在范围内。如果不是,则会生成window
(浏览器中的全局对象),如果是,则会生成exports
(用于导出内容的标准名称 [某种]模块 - 见Relation between CommonJS, AMD and RequireJS?)。然后将结果分配给root
。
如果您想知道条件运算符,
var d = a ? b : c;
或多或少等同于
var d;
if (a) {
d = b;
} else {
d = c;
}
至于root.Retina = Retina;
,就像JavaScript中的所有其他属性一样,没有必要声明它,也没有工具来声明它。
答案 1 :(得分:0)
如果导出类型等于' undefined',则我们将其设置为窗口。否则,我们将其设置为导出。
它的三元组,你可以这样做:
if(typeof(exports) === 'undefined')
root = window;
else
root = exports
答案 2 :(得分:0)
var root = (typeof exports === 'undefined' ? window : exports);
此行检查exports
是否不是undefined
。在Node.js环境中,exports
特殊变量指的是当前模块。因此,如果未定义exports
,则您使用的是Node.js环境中的浏览器。
因此,如果您在浏览器中,root
将引用window
对象,否则为当前模块对象(exports
)。 root.Retina
将Retina
函数分配给窗口或当前模块。