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

西信

假设我有一个称为的旧文件module.js,如下所示:

a=1;

默认情况下,当您在浏览器中执行该操作时,该window对象将附加到污染global(实际上是window)作用域对象上

我是否可以将其附加到其他对象,而不更改源代码的内容?

由于唯一真正的问题是执行上下文,而没有别的,理想的解决方案将是这样的:

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在有分配的地方添加代码,这意味着扫描整个代码。

我只是想尝试以最小的努力来改进为浏览器准备的旧代码的方法。

Moti Korets

第一个问题的答案,否,无法在浏览器中更改默认执行上下文。window是一个特殊变量,将其他任何赋值都不会更改默认执行上下文。请参阅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选项,选项将在某些情况下应用自动修复,例如从单引号更改为双引号(这主要是与样式相关的规则)。
  • 漂亮的是仅关注代码外观的代码格式化程序:缩进,空格等。
  • AST资源管理器AST资源管理器是一个在线工具,使您可以查看上述所有工具的内部知识,这对于理解其工作原理以及尝试在小示例中进行编码非常有用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当我们将方法存储在变量中然后调用它时,为什么上下文对象更改为全局窗口对象?

来自分类Dev

我们可以使用javascript将图像推送到浏览器缓存吗

来自分类Dev

我可以从消息上下文中获得什么其他对象

来自分类Dev

我们可以在不显示在层次结构窗口的上下文菜单中的游戏对象菜单中添加菜单项吗?

来自分类Dev

JavaScript中的“调用上下文”和“执行上下文”:我们在谈论同一件事吗?

来自分类Dev

我们可以像在python中一样在Go中创建上下文管理器吗

来自分类Dev

我们可以将jaxb上下文绑定保存到oxm元数据文件吗?

来自分类Dev

我可以将两个对象传递给createPage中的上下文吗?

来自分类Dev

我们可以使用ANTLR定义非上下文无关的语法吗?

来自分类Dev

我们可以在React Context API中创建多个上下文吗?

来自分类Dev

我们可以在dialogflow中添加超过5个输入上下文吗?

来自分类Dev

我可以将主题颜色栏浏览器更改为渐变颜色吗?

来自分类Dev

我可以阻止浏览器将 <image> 标签更改为 <img /> 吗?

来自分类Dev

将线程的上下文更改为其他用户

来自分类Dev

我可以强制浏览器在javascript执行期间呈现DOM更改吗

来自分类Dev

我们可以使用javascript获取安装在浏览器中的搜索引擎列表吗?

来自分类Dev

访问其他文件中的Lambda上下文对象

来自分类Dev

我们可以在其他模式中为对象处于不同模式的其他对象创建私有同义词吗

来自分类Dev

我们可以在python selenium webdriver中缩放浏览器窗口吗?

来自分类Dev

Javascript中的执行上下文和执行上下文对象

来自分类Dev

ConcreteState对象可以更改它们所驻留的上下文吗?

来自分类Dev

将Windows 7资源管理器的“编辑”上下文菜单操作更改为jpg和其他图像文件类型

来自分类Dev

我们是否应该始终将对象设置回Install4j中的上下文?

来自分类Dev

在对象文字的声明中继承上下文(此)?自我可以吗?

来自分类Dev

我可以通过Django视图在Decorator中访问上下文对象吗

来自分类Dev

JavaScript中的执行上下文和对象

来自分类Dev

我们可以将 rundeck 日志位置更改为 /data 目录吗?

来自分类Dev

我们可以将默认的角材料芯片设计更改为矩形吗?

来自分类Dev

CodeDom在哪里保存生成的.cs文件?我们可以将此位置更改为其他文件夹吗?

Related 相关文章

  1. 1

    当我们将方法存储在变量中然后调用它时,为什么上下文对象更改为全局窗口对象?

  2. 2

    我们可以使用javascript将图像推送到浏览器缓存吗

  3. 3

    我可以从消息上下文中获得什么其他对象

  4. 4

    我们可以在不显示在层次结构窗口的上下文菜单中的游戏对象菜单中添加菜单项吗?

  5. 5

    JavaScript中的“调用上下文”和“执行上下文”:我们在谈论同一件事吗?

  6. 6

    我们可以像在python中一样在Go中创建上下文管理器吗

  7. 7

    我们可以将jaxb上下文绑定保存到oxm元数据文件吗?

  8. 8

    我可以将两个对象传递给createPage中的上下文吗?

  9. 9

    我们可以使用ANTLR定义非上下文无关的语法吗?

  10. 10

    我们可以在React Context API中创建多个上下文吗?

  11. 11

    我们可以在dialogflow中添加超过5个输入上下文吗?

  12. 12

    我可以将主题颜色栏浏览器更改为渐变颜色吗?

  13. 13

    我可以阻止浏览器将 <image> 标签更改为 <img /> 吗?

  14. 14

    将线程的上下文更改为其他用户

  15. 15

    我可以强制浏览器在javascript执行期间呈现DOM更改吗

  16. 16

    我们可以使用javascript获取安装在浏览器中的搜索引擎列表吗?

  17. 17

    访问其他文件中的Lambda上下文对象

  18. 18

    我们可以在其他模式中为对象处于不同模式的其他对象创建私有同义词吗

  19. 19

    我们可以在python selenium webdriver中缩放浏览器窗口吗?

  20. 20

    Javascript中的执行上下文和执行上下文对象

  21. 21

    ConcreteState对象可以更改它们所驻留的上下文吗?

  22. 22

    将Windows 7资源管理器的“编辑”上下文菜单操作更改为jpg和其他图像文件类型

  23. 23

    我们是否应该始终将对象设置回Install4j中的上下文?

  24. 24

    在对象文字的声明中继承上下文(此)?自我可以吗?

  25. 25

    我可以通过Django视图在Decorator中访问上下文对象吗

  26. 26

    JavaScript中的执行上下文和对象

  27. 27

    我们可以将 rundeck 日志位置更改为 /data 目录吗?

  28. 28

    我们可以将默认的角材料芯片设计更改为矩形吗?

  29. 29

    CodeDom在哪里保存生成的.cs文件?我们可以将此位置更改为其他文件夹吗?

热门标签

归档