这段代码中发生了什么,如果没有“with”关键字,下面的基本实现将是什么

时间:2016-01-21 01:42:29

标签: javascript

我正在通过一个代码库来创建一个用于JavaScript的多平台包管理和模块系统。

我发现了一个代码路径,它是从与“exports”变量相关联的函数中提取的。 我已经在下面附加了代码片段,在运行代码片段时,您会发现“print”对象是从函数中提取的。 我想知道两件事: -

  1. 这段代码是如何工作的?
  2. 如果没有with语句,这个代码可以更简单的方式实现吗?
  3. 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

1 个答案:

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