Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 向函数添加本地作用域_Javascript - Fatal编程技术网

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
更具可读性和“标准”。