Доступ к переменным от других функций, не используя глобальные переменные

Я не знаю, откуда ваше замешательство. Согласно 10.2.1 , очень ясно, что есть или нет «в строгом режиме». В вашем примере внутренний слот foo s [[Strict]] будет true действительно и будет находиться в строгом режиме, но его размещение в блоке не будет. Первое предложение (указанное вами) относится к блоку хостинга, а не к содержащемуся в нем содержимому. Блок в вашем фрагменте не находится в строгом режиме и, следовательно, этот раздел применяется к нему.

65
задан Andreas Grech 2 January 2009 в 15:26
поделиться

8 ответов

Для создания переменной вычисленной в функции видимое в функции B у Вас есть три варианта:

  • делают его, глобальное,
  • делают его свойством объекта, или
  • передача это в качестве параметра при вызове B от A.

, Если Ваша программа является довольно маленькой тогда, globals не так плохи. Иначе я рассмотрел бы использование третьего метода:

function A()
{
    var rand_num = calculate_random_number();
    B(rand_num);
}

function B(r)
{
    use_rand_num(r);
}
52
ответ дан Paul Stephenson 7 November 2019 в 11:29
поделиться

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

var MyApp = {}; // Globally scoped object

function foo(){
    MyApp.color = 'green';
}

function bar(){
    alert(MyApp.color); // Alerts 'green'
} 

Никто не должен вопить на Вас для того, чтобы сделать что-то как вышеупомянутое.

72
ответ дан Triptych 7 November 2019 в 11:29
поделиться

Рассмотрите использование пространств имен:

(function() {
    var local_var = 'foo';
    global_var = 'bar'; // this.global_var and window.global_var also work

    function local_function() {}
    global_function = function() {};
})();

И local_function и global_function имеют доступ ко всем локальным и глобальным переменным.

Редактирование : Другой общий шаблон:

var ns = (function() {
    // local stuff
    function foo() {}
    function bar() {}
    function baz() {} // this one stays invisible

    // stuff visible in namespace object
    return {
        foo : foo,
        bar : bar
    };
})();

return к свойствам редактора можно теперь получить доступ через объект пространства имен, например, ns.foo, в то время как все еще сдерживающий доступ к локальным определениям.

15
ответ дан Christoph 7 November 2019 в 11:29
поделиться

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

2
ответ дан tvanfosson 7 November 2019 в 11:29
поделиться

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

Globals считают плохими, потому что состояние globals и несколько модификаторов могут создать трудно для следования за кодом и странными ошибками. Ко многим агентам, играющим с чем-то, может создать хаос.

1
ответ дан Arthur Thomas 7 November 2019 в 11:29
поделиться

Если другая функция должна использовать переменную, Вы передаете ее функции как аргумент.

Также глобальные переменные не являются по сути противными и злыми. Пока они используются правильно нет никакой проблемы с ними.

4
ответ дан Adam Peck 7 November 2019 в 11:29
поделиться

То, что Вы ищете, технически известно как приправление карри.

function getMyCallback(randomValue)
{
    return function(otherParam)
    {
        return randomValue * otherParam //or whatever it is you are doing.
    }

}

var myCallback = getMyCallBack(getRand())

alert(myCallBack(1));
alert(myCallBack(2));

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

8
ответ дан AnthonyWJones 7 November 2019 в 11:29
поделиться

Вы можете полностью контролировать выполнение функций javascript (и передавать между ними переменные) с помощью пользовательских событий jQuery... Мне говорили, что это невозможно на всех этих форумах, но я получил что-то работающее, что делает именно это (даже с использованием вызова ajax).

Вот ответ (ВАЖНО: это не проверенный ответ, а ответ моего «Эмиля»):

Как получить переменную, возвращаемую несколькими функциями — Javascript/jQuery

1
ответ дан 24 November 2019 в 15:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: