假设我有一个称为的旧文件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
在有分配的地方添加代码,这意味着扫描整个代码。
我只是想尝试以最小的努力来改进为浏览器准备的旧代码的方法。
第一个问题的答案,否,无法在浏览器中更改默认执行上下文。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转换,并且根据您的目标,您可能应该使用其中的一个或多个。
codemods
接收代码并对其进行转换的函数。这可能是该类别中最强大的工具。--fix
选项,该选项将在某些情况下应用自动修复,例如从单引号更改为双引号(这主要是与样式相关的规则)。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句