此代码中发生了什么,如果没有“with”关键字,以下内容的基本实现是什么

what is happening in this code and what will be the basic implementation of the following without the "with" keyword

本文关键字:是什么 实现 发生了 代码 什么 如果没有 with 关键字      更新时间:2023-09-26

我正在浏览一个代码库,该代码库正在为JavaScript创建一个多平台包管理和模块系统。

我找到了一条代码路径,该路径是从与"export"变量关联的函数中提取的。我在下面附加了代码片段,在运行代码片段时,您会发现"print"对象从函数中提取。我想知道两件事:-

  1. 这段代码是如何工作的?
  2. 是否可以在没有 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);
      }
    }
  }
};