javascript - 这段代码中发生了什么,以及在没有 "with"关键字的情况下以下代码的基本实现是什么

标签 javascript

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

我找到了一条代码路径,该路径是从与“exports”变量关联的函数中提取的。 我附上了下面的代码片段,在运行该片段时,您会发现“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 语句是这样做的:

The with statement adds an object environment record for a computed object to the lexical environment of the current execution context. It then executes a statement using this augmented lexical environment. Finally, it restores the original lexical environment.

基本上,这意味着当您将对象分配给标识符 exports 时,它会成为 args 的属性。

不要这样做。 with 语句性能不好,在严格模式下是不允许的。正常赋值即可。

var fn = function(args) {
  return function logger() {
    args.exports = {
      print: function(res) {
        console.log(res);
      }
    }
  }
};

关于javascript - 这段代码中发生了什么,以及在没有 "with"关键字的情况下以下代码的基本实现是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34913938/

相关文章:

javascript - 如何获得输入值的总和?

javascript - event.persist 不是函数 - JEST 和 Enzyme

javascript - vue-cli webpack项目(vue.js)中Greensock插件的使用方法

javascript - 如果系统电源中断,则不会保存 Cookie

javascript - 在 QML 中加载页面时运行 javascript 函数

javascript - 如何在不刷新页面的情况下更改 URI?

javascript - 使用自定义用户界面设备连接到 OpenSeadragon

javascript - 使用 Jest CLI 时如何让 Promises 工作?

javascript - 网格的字段绑定(bind)。将新记录添加到 Store 后 View 仍然不一致

javascript - 弹出窗口不在屏幕中心 - CSS 问题