自从一年多前开始使用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
对象的一部分。
唯一需要注意的是,这里定义的函数都不会成为全局变量,所以你不能在像onclick="foo()"
这样的东西中使用它们。这不应该是一个严重的问题,因为这样的编码现在被认为是不好的风格。但是如果你想能够做到这一点,你可以像这样定义函数:
window.foo = function() { ... };
如果您需要许多全局名称,则应将它们收集到一个对象中并将其放在window
中;使用单个对象可以避免污染全局命名空间,这可能会与您加载的其他库发生冲突(您可以在jQuery,underscore.js和lodash等库中看到这种方法)。
通常,当您想要创建一些东西来容纳命名项时,您应该使用一个对象(或ES6 Map
)。虽然任何类型的数据都可以赋予属性,但这是对象的明确目的。