我是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);
答案 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;