我正在浏览一个代码库,该代码库正在为JavaScript创建一个多平台包管理和模块系统。
我找到了一条代码路径,该路径是从与"export"变量关联的函数中提取的。我在下面附加了代码片段,在运行代码片段时,您会发现"print"对象从函数中提取。我想知道两件事:-
- 这段代码是如何工作的?
- 是否可以在没有 with 语句的情况下以更简单的方式实现此代码?
var context = {
exports: {}
};
var fn = (function(args) {
with(args) {
return function logger() {
exports = {
print: function(res) {
console.log(res);
}
}
}
}
});
fn = fn(context);
fn.call();
context.exports.print('hello World'); //Prints the hello world
首先,计算非字符串是没有意义的。删除eval
调用并仅使用该函数。
从技术上讲,with
语句是这样做的:
with
语句为 计算对象到当前词法环境 执行上下文。然后,它使用此增强的语句执行 词汇环境。最后,它恢复了原始词汇 环境。
基本上,这意味着当您将对象分配给标识符exports
时,它将成为 args
的属性。
别这样。with
语句性能不佳,在严格模式下不允许。只需正常分配属性即可。
var fn = function(args) {
return function logger() {
args.exports = {
print: function(res) {
console.log(res);
}
}
}
};