在定义没有 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
)。虽然可以为任何类型的数据赋予属性,但这是对象的明确目的。
自从一年多前开始使用 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
)。虽然可以为任何类型的数据赋予属性,但这是对象的明确目的。