我正在通过一个代码库来创建一个用于JavaScript的多平台包管理和模块系统。
我发现了一个代码路径,它是从与“exports”变量相关联的函数中提取的。 我已经在下面附加了代码片段,在运行代码片段时,您会发现“print”对象是从函数中提取的。 我想知道两件事: -
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
答案 0 :(得分:2)
首先,评估非字符串是没有意义的。删除eval
电话,然后使用该功能。
从技术上讲,with
语句执行此操作:
with
语句为a添加object environment record 将对象计算到当前的lexical environment 执行上下文。然后使用此扩充执行语句 lexical environment。最后,它会恢复原始的lexical environment。
基本上,这意味着当您将对象分配给标识符exports
时,它将成为args
的属性。
不要这样做。 with
语句性能不佳,严格模式下不允许。只需正常分配财产。
var fn = function(args) {
return function logger() {
args.exports = {
print: function(res) {
console.log(res);
}
}
}
};