Можете ли вы создать объект, который будет предпочтительнее окна при определении переменной без объявления переменной var? - PullRequest
1 голос
/ 23 апреля 2019

С самого начала 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 вне моего кода?

1 Ответ

0 голосов
/ 23 апреля 2019

Более простое решение - поместить весь ваш код в 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).Хотя любому типу данных могут быть присвоены свойства, это прямое назначение объектов.

...