【问题标题】:What does this line of javascript mean?这行javascript是什么意思?
【发布时间】:2014-04-28 14:51:44
【问题描述】:

我刚打开 Retina.js 希望能学到一些东西,但我被第一行难住了。

var root = (typeof exports === 'undefined' ? window : exports);

这条线具体是做什么的?

再往下,

 function Retina() {}

 root.Retina = Retina;

Retina 属性是如何在没有先定义的情况下从根中设置出来的?

【问题讨论】:

标签: javascript properties


【解决方案1】:

typeof 是一个运算符,当它用于根本未定义的变量时,仍会产生值 'undefined'。所以表达式:

(typeof exports === 'undefined' ? window : exports)

检查exports 是否不在范围内。如果不是,则生成 window(浏览器中的全局对象),如果是,则生成 exports(用于从 [sort of] 导出 things 的标准名称模块——见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 中的所有其他属性一样,无需声明它,也没有任何工具可以声明它。

【讨论】:

  • 你把我的问题搞明白了!我正在寻找关于出口逻辑的解释。谢谢。
【解决方案2】:

如果导出的类型等于“未定义”,那么我们将其设置为窗口。否则,我们将其设置为导出。

它是三元的,你可以这样做:

if(typeof(exports) === 'undefined') 
root = window;
else 
root = exports

【讨论】:

    【解决方案3】:
    var root = (typeof exports === 'undefined' ? window : exports);
    

    此行检查exports 是否不是undefined。在 Node.js 环境中,exports 特殊变量指的是当前模块。所以,如果 exports 没有定义,那么你在浏览器中,否则是 Node.js 环境。

    因此,如果您在浏览器中,root 将引用 window 对象,否则,当前模块对象 (exports)。 root.RetinaRetina 函数分配给窗口或当前模块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 2019-02-03
      • 2013-08-17
      • 2011-09-04
      相关资源
      最近更新 更多