我已养成在所有功能的顶部添加以下内容的习惯:
var local = {};
这样,我明确地规范了我的所有变量。例如:
for (local.i=0; local.i<x; local.i++) {} // local scope: good!
for (i=0; i<x; i++) {} // accidental global scope: bad!
问:有没有办法将Function原型更改为包含var local = {};作为其定义的一部分?这样我可以假设“本地”。意味着明确地在本地范围内。
答案 0 :(得分:3)
答案是否定的,您不能隐式添加变量声明并在每个函数范围内初始化它(谢天谢地)。您需要手动管理变量范围,在需要时使用分析工具。
想象一下,如果这是可能的话。您加载的任何代码都可能破坏任何其他变量范围,从而有效地破坏了范围变量的目的。
Function.prototype
无济于事,因为原型继承与变量范围无关。
通过将i
放入local
对象来保护i
的技巧并不能解决问题。它只是将问题从local
变量移到i
变量,但仍然不会阻止您使用local.i
而不是"use strict";
。
虽然包含{{1}}可以通过提供有用的错误消息来提供帮助,但您需要记住,它会在某些可能破坏代码的情况下改变行为。
答案 1 :(得分:1)
不,你不能这样做。你不能将代码注入任意函数,并且通过更改Function.prototype
来实现 本地范围,并且这是良好的事物。
此外,您如何强制使用local
对象进行局部变量?您将如何通过父作用域允许变量查找,例如:
function f() {
var a = 5;
return function g(b) {
return a + b;
};
}
在您的解决方案中,local
和f
函数中有g
个对象,但local
中的g
变量会隐藏父母的变量......
function f() {
var local = { a : 5 };
return function g(b) {
// This declaration hides the parent's declaration
var local = { b : b };
// How would local.a be found?
return local.a + local.b;
};
}
但是对于您的原始问题有一个更简单的解决方案:只需使用"use strict"
启用严格模式。这样,当您意外地将变量泄漏到全局范围时,会出现错误。例如,当您尝试访问未声明的ReferenceError
变量(而不是创建新的全局变量)时,您的第二个示例将抛出i
。
请注意,严格模式不仅仅是防止意外的全局变量,read up on it让您了解后果!