请解释下面的代码。这是来自任何框架

时间:2017-07-21 05:05:27

标签: javascript

我是javascript的新手。有人可以解释下面代码的作用。它似乎不像常规的JavaScript。这是使用像node.js或underscore.js这样的任何框架吗?

这里有'出口和其他功能'。请简单介绍一下这个库文件。

(function (exports, global) {

    "use strict";

    var _ = {};
    exports.internal = _;

    exports.debugLogEnabled = true;

    _.debug = function (x) {
        if (exports.debugLogEnabled) {
            console.log(x);
        }
    };

    _.removeAllElements = function (array) {
        array.length = 0;
    };

    _.addElements = function (array, elements) {
        elements.forEach(function (element) {
            array.push(element);
        });
    };

    _.contains = function (array, element) {
        return array.indexOf(element) >= 0;
    };

    _.isUndefined = function (x) {
        return typeof(x) === 'undefined';
    };

    _.setDefault = function (obj, key, defaultValue) {
        if (_.isUndefined(obj[key])) {
            obj[key] = defaultValue;
        }
    };

    _.forKeyValue = function (obj, f) {
        var key;
        for (key in obj) {
            if (obj.hasOwnProperty(key)) {
                f(key, obj[key]);
            }
        }
    };

    _.merge = function (obj, defaults) {
        _.forKeyValue(defaults, function (key, value) {
            _.setDefault(obj, key, value);
        });
    };

    };
})(typeof exports === 'undefined' ? this.sec = {} : exports, this);

2 个答案:

答案 0 :(得分:0)

这是所有本机javascript。没有证据表明您在帖子中共享的代码中使用了任何外部JavaScript库。

您的功能实际上是一个立即调用的函数表达式(IIFE),如here所述。

从链接引用:

  

它在创建后立即执行。经常使用这种模式   当试图避免污染全局命名空间时,因为所有   IIFE中使用的变量(与任何其他正常函数一样)是   在其范围之外不可见。

答案 1 :(得分:0)

此样式称为立即调用的函数表达式(IIFE)。

第一行:

(function (exports, global) {

是函数表达式的开始,它接受两个参数并将第一个赋值给名为“exports”的变量,第二个赋值给名为“global”的变量。这些变量仅在函数内可用(即它们是局部变量)。

现在跳到最后一行,看看如何调用该函数:

})(typeof exports === 'undefined' ? this.sec = {} : exports, this);

这会调用IIFE并传递两个值,第一个是评估结果:

typeof exports === 'undefined' ? this.sec = {} : exports

使用条件? :运算符(又名“三元运算符”)。表达式typeof exports === 'undefined'被计算,如果它返回true(即没有全局变量“exports”),则表达式为:

this.sec = {}
评估

并返回结果。由于它是全局代码,this引用全局(浏览器中的窗口)对象,表达式创建一个名为“sec”的属性并为其指定一个空对象。然后将该值(即对空对象的引用)作为调用中的第一个值传递。

如果表达式返回false(即全局“exports”未定义),则其值将作为调用中的第一个值传递。

传递的第二个值是 this ,如前所述,它是对全局对象的引用。

因此,当执行该函数时, exports 引用一个对象, global 引用该全局对象。

其余的应该非常直截了当。也许用“myObj”替换“_”,所以:

var _ = {};
exports.internal = _;

变为:

var myObj = {};
exports.internal = myObj;

它可以写成单个初始化器:

var myObj = {
  debug: function (x) {
    if (exports.debugLogEnabled) {
        console.log(x);
  },
  removeAllElements: function (array) {
    array.length = 0;
  },
  // and so on...
};

exports.internal = myObj;
exports.debugLogEnabled = true;