JavaScript-замыкания используют объект глобальной настройки или передают его каждой функции - PullRequest
2 голосов
/ 27 сентября 2011

другой вопрос, касающийся закрытия javascricpt. У меня есть глобальный «объект настроек». Лучше ли использовать его изнутри функций в глобальной области видимости или передавать объект каждый раз, когда функция нуждается в доступе к объекту?

Для лучшего понимания небольшой макет ситуации здесь

Пожалуйста, не обращайте внимания на то, что "baz ()" также получает переданный объект в "foobar ()" из глобальной области видимости в замыкании. Вы видите, что обе версии работают нормально.

Дело в том, что я передаю любой объект, который функция должна работать, каждой функции и КАЖДОМУ разу (ненужные накладные расходы?), Что может быть приятно и легко читать / понимать, но я серьезно думаю об изменении этого. Недостатком было бы то, что я должен держать область действия «это» там, где она становится глубже, верно?

Спасибо за ваш совет!

Ответы [ 2 ]

3 голосов
/ 27 сентября 2011

Ваш объект настроек не является глобальным , он определен внутри замыкания.

Поскольку предполагается, что он будет доступен другой функции в замыкании,Я бы сказал, что вы на 100% хороши, чтобы просто получить доступ к этому объекту напрямую и не передавать его в качестве параметра.

FWIW, даже если вы передадите его в качестве параметра, издержки будут незначительными, поскольку только передается ссылка на объект, а не копия всего объекта.

1 голос
/ 27 сентября 2011

Итак, у вас есть три основных варианта:

  • Вы хотите выставить настройки как глобальную переменную и получить к ней доступ из ваших функций,
  • Вы хотите скрыть настройки как детали реализации и получить к ним доступ в своих функциях,
  • Вы хотите дать возможность предоставлять различные объекты настроек для разных функций.

Подход глобальной переменной

Ну, я думаю, это немного похоже на любую глобальную переменную. Если настройки одноэлементные (например, они описывают ваше приложение) и вы не видите никакой выгоды в возможности вызова одной и той же функции с различными объектами настроек, то я не понимаю, почему она не может быть глобальной переменной .

Тем не менее, из-за всех конфликтов имен, в Javascript хорошо "пространством имен" всех глобальных переменных. Таким образом, вместо глобальных переменных foo и bar вы должны иметь одну глобальную переменную MyGlobalNamespace, которая представляет собой объекты с атрибутами: MyGlobalNamespace.foo и MyGlobalNamespace.bar.

Частный переменный подход

Наличие закрытой переменной, доступ к которой осуществляется с помощью замыкания, является хорошим шаблоном для скрытия деталей реализации. Если объект настроек - это то, что вы не хотите предоставлять в виде API, это, вероятно, правильный выбор.

Подход с использованием дополнительных функциональных параметров

В основном, если вы видите выгоду от возможности предоставления разных настроек для разных вызовов функций. Или, может быть, если вы можете представить себе такой выигрыш в будущем. Очевидный выбор, если у вас много экземпляров настроек в вашем приложении.

EDIT

По вопросу из комментариев:

Пример 1)

var blah = 123;

function fizbuzz() {
    console.log(blah); // <-- This is an example of a closure accessing 
                       // a variable
    console.log(this.blah); // <-- Most likely makes no sense. It might work, 
                            // because by default this will be set to a global 
                            // object named window, but this is probably not 
                            // what you want. In other situations this might 
                            // point to another object.
}

Пример 2)

var obj = {

    blah: 123,

    fizbuzz: function() {
        console.log(this.blah); // <-- This is *NOT* an example of a closure
                                // accessing a private variable. It's rather the
                                // closest Javascript can get to accessing an
                                // instance variable by a method, though this 
                                // terminology shouldn't be used.
        console.log(blah); // <-- This MAKES NO SENSE, there is no variable blah 
                           // accessible from here.
    }
};

Вкратце, я бы посоветовал вам прочитать хорошую книгу о фундаментальных концепциях Javascript. У него есть свои особенности, и их приятно знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...