在定义没有 var 声明的变量时,您能否创建一个优先于 window 的对象?

Can you create an object that will be preferred over window when defining a variable with no declaration of var?

自从一年多前开始使用 JS 以来,我一直遇到在函数内部声明但想在函数外部访问的变量的问题。最初,我会在所有其他脚本之上使用 script 元素,如果我不想将它添加到列表,我想用 var x,y,z;window.x = __; 声明的每个变量像那样。跟上这很烦人,所以当我了解到不使用 var 来声明东西,但仍然能够访问它们时,我开始这样做了。现在我看到像 this 这样的东西,它说出于各种原因对所有变量使用 var。如果之前没有变量声明,是否可以创建一个变量冒泡到而不是 window 的对象,或者替代 var 声明?我有想法做一些像

window.NewVarList = [];
//or is  « var NewVarList = []; »  more appropriate?

function gvar(NewVar,SetVal){
    window.NewVarList[NewVar] = SetVal;
    //or  « NewVarList[NewVar] = SetVal; »
}

但不知道如何在 NewVarList 中立即搜索变量(使用 VarInList 而不是 NewVarList['VarInList'])或如何立即搜索 gvar x = __;使用正确的类型调用 gvar(x,__) 作为我想要设置的值,而不是一切都是字符串。是否可以使所有没有 var 声明的变量立即转到 window.NewVarList 并在不需要 NewVarList[VarName] 的情况下搜索它们?如果我不能让事情立即冒泡到 NewVarList,我可以让 gvar 工作而不需要正常的括号和参数吗?或者我应该回去定义我的函数之外的所有变量吗?继续在我的代码中保留 var 声明是否安全?

一个更简单的解决方案是将所有代码放在一个 IIFE 中。

;function() {
    // all your code goes here
    var x, y, z;

    function foo() { ... }
    function bar() { ... }
    ...

}();

您在 IIFE 顶层声明的变量可以在所有其他函数中用作全局变量,但它们不会成为 window 对象的一部分。

唯一需要注意的是,此处定义的 none 函数也成为全局变量,因此您不能在 onclick="foo()" 之类的地方使用它们。这应该不是一个严重的问题,因为如今这样的编码被认为是糟糕的风格。但是如果你想这样做,你可以这样定义函数:

window.foo = function() { ... };

如果您需要多个全局名称,您应该将它们收集到一个对象中并将其放入 window;使用单个对象避免污染全局命名空间,这可能 运行 与您加载的其他库发生冲突(您可以在 jQuery、underscore.js 和 lodash 等库中看到这种方法)。

一般来说,当你想创建一些东西来保存命名项时,你应该使用对象(或 ES6 Map)。虽然可以为任何类型的数据赋予属性,但这是对象的明确目的。