将本地范围添加到函数中

时间:2013-12-26 19:49:32

标签: 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!

问:有没有办法将Function原型更改为包含var local = {};作为其定义的一部分?这样我可以假设“本地”。意味着明确地在本地范围内。

2 个答案:

答案 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;
    };
 }

在您的解决方案中,localf函数中有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让您了解后果!