在定义没有var声明的变量时,是否可以创建一个优先于窗口的对象?

问题描述 投票:1回答:1

自从一年多前开始使用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声明从我的代码中删除是否安全?

javascript var
1个回答
0
投票

更简单的解决方案是将所有代码放在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)。虽然任何类型的数据都可以赋予属性,但这是对象的明确目的。

© www.soinside.com 2019 - 2024. All rights reserved.