代码之家  ›  专栏  ›  技术社区  ›  Nishant Florentin

我们可以将浏览器JavaScript的执行上下文从Window对象更改为其他对象吗?

  •  2
  • Nishant Florentin  · 技术社区  · 8 年前

    假设我有一个名为 module.js 是这样的:

    a=1;

    默认情况下,这会附加到 window 污染 global (实际上 窗 )在浏览器中执行时的范围。

    我是否可以在不更改源代码内容的情况下将其附加到其他对象?

    由于唯一真正的问题是执行上下文而不是其他问题,理想的解决方案应该是这样的:

    change execution context from window to module object;
    execute the code;
    change execution context from module to window object;
    

    如果这是不可能的,那么在源代码中添加包装器(如IIFE)就可以了,只要内部内容没有更改。更改内部内容需要对代码进行全面扫描,这很昂贵。

    例如,我可以将其包装成这样的函数():

    function module()
    {
        a=1;
    }
    

    如果严格执行,我可以避免全球范围的污染。然而,我拿不到这个物体。

    我不想做这样的事情:

    module = function module()
    {
        return a=1;
    }
    

    因为我们需要添加 return 只要有赋值,就意味着扫描整个代码。

    我只是想找到一些方法来改进传统的浏览器代码,而只需付出最小的努力。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Nishant Florentin    8 年前

    第一个问题的答案是“否”,无法更改浏览器中的默认执行上下文。 window 是一个特殊变量,向其分配任何其他内容都不会更改默认的执行上下文。看见 Global Object 在MDN中。这是一个例子

    (function() {
      window = {}
      a = 5 // leaking declaration
      var b = 10
    })()
    
    console.log(a) // a is on global scope
    //console.log(b) // exception b is not defined in this scope
    var b = 5
    window = new Object()
    window.c = 5
    console.log(window.b) // 5 
    console.log(c)  // 5

    关于如何使用遗留代码的第二部分,有许多工具可以进行AST转换,根据您的目标,您可能应该使用其中的一个或多个工具。

    • jscodeshift 允许您写入 codemods 这些函数接收代码并对其应用转换。这可能是这一类中最强大的工具。
    • ESLint 允许您设置规则(例如,无全局变量)并具有 --fix 选项,该选项将在某些情况下应用自动修复,例如从单引号更改为双引号(这主要用于样式相关的规则)。
    • prettier 代码格式化程序只与代码外观有关:缩进、空格等。
    • AST Explorer 这是一个在线工具,可以让您查看上述所有工具的内部结构,对于理解其工作原理和在小示例上尝试代码非常有用。