Javascript 向函数添加本地作用域
我养成了在所有函数的顶部添加以下内容的习惯:Javascript 向函数添加本地作用域,javascript,Javascript,我养成了在所有函数的顶部添加以下内容的习惯: var local = {}; 这样,我可以显式地定义所有变量的范围。例如: for (local.i=0; local.i<x; local.i++) {} // local scope: good! for (i=0; i<x; i++) {} // accidental global scope: bad! for(local.i=0;local.i答案是否定的,您不能隐式添加变量声明并在每个函数范围内初始化它(谢天谢地)。您需
var local = {};
这样,我可以显式地定义所有变量的范围。例如:
for (local.i=0; local.i<x; local.i++) {} // local scope: good!
for (i=0; i<x; i++) {} // accidental global scope: bad!
for(local.i=0;local.i答案是否定的,您不能隐式添加变量声明并在每个函数范围内初始化它(谢天谢地)。您需要手动管理变量范围,在需要时使用分析工具
想象一下,如果这是可能的话,你加载的任何代码都有可能破坏任何其他变量的作用域,实际上破坏了作用域变量的用途
函数.prototype
不会有帮助,因为原型继承与变量范围无关
通过将i
放入local
对象来保护i
的技巧并不能解决任何问题。它只是将问题从i
变量移动到local
变量,并且仍然不会阻止您使用i
而不是local.i
包括“使用严格的”;
可以通过提供有用的错误消息来帮助您,您需要记住,在某些情况下,它会改变行为,从而破坏代码。不,您不能这样做。您不能将代码注入任意函数,也不能通过更改函数.prototype
来扰乱它们的局部范围,这是一件好事
此外,您将如何强制对局部变量使用local
对象?您将如何允许通过父作用域查找变量,例如:
function f() {
var a = 5;
return function g(b) {
return a + b;
};
}
在您的解决方案中,在f
和g
函数中有一个local
对象,但是g
中的local
变量将隐藏父变量
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”
启用严格模式。这样,当您意外地将变量泄漏到全局范围时,就会出现一个错误。例如,您的第二个示例在尝试访问未声明的i
变量时会抛出一个ReferenceError
(而不是创建新的全局变量)
请注意,严格模式不仅仅是防止意外的全局变量,因此您可以理解其后果!我不确定这如何比显式使用var关键字更方便。在任何一种情况下,您都需要记住使用前缀,为什么不坚持使用内置的前缀呢?当然,您可以尝试使用它urce代码转换程序,如esprima。但我怀疑在不进行代码转换的情况下,您是否可以执行类似操作。使用“use strict”
?这样,当您意外地将变量泄漏到全局范围时,会出现错误。请使用函数包装for循环,并且不要忘记var
关键字。“…下面是我所有函数的顶部”:这不需要,因为JavaScript变量具有函数作用域(如果使用var
关键字)。使用var
更具可读性和“标准”。