Я не знаю, откуда ваше замешательство. Согласно 10.2.1 , очень ясно, что есть или нет «в строгом режиме». В вашем примере внутренний слот foo
s [[Strict]]
будет true
действительно и будет находиться в строгом режиме, но его размещение в блоке не будет. Первое предложение (указанное вами) относится к блоку хостинга, а не к содержащемуся в нем содержимому. Блок в вашем фрагменте не находится в строгом режиме и, следовательно, этот раздел применяется к нему.
Для создания переменной вычисленной в функции видимое в функции B у Вас есть три варианта:
, Если Ваша программа является довольно маленькой тогда, globals не так плохи. Иначе я рассмотрел бы использование третьего метода:
function A()
{
var rand_num = calculate_random_number();
B(rand_num);
}
function B(r)
{
use_rand_num(r);
}
Я думаю, что Ваш лучший выбор здесь может состоять в том, чтобы определить единственный глобально ограниченная по объему переменная и дамп Ваших переменных там:
var MyApp = {}; // Globally scoped object
function foo(){
MyApp.color = 'green';
}
function bar(){
alert(MyApp.color); // Alerts 'green'
}
Никто не должен вопить на Вас для того, чтобы сделать что-то как вышеупомянутое.
Рассмотрите использование пространств имен:
(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
, в то время как все еще сдерживающий доступ к локальным определениям.
Если существует шанс, что Вы снова используете этот код, то я, вероятно, приложил бы усилие для движения с объектно-ориентированной перспективой. Используя глобальное пространство имен может быть опасным - Вы рискуете трудно для нахождения ошибок из-за имен переменной, которые снова используются. Обычно я запускаю при помощи объектно-ориентированного подхода для чего-то большего чем простого обратного вызова так, чтобы я не делал вещи перезаписи. Любое время, когда у Вас есть группа связанных функций в JavaScript, я думаю, это - кандидат на объектно-ориентированный подход.
Я не знаю специфических особенностей Вашей проблемы, но если для функции нужно значение тогда, это может быть параметр, прошел через вызов.
Globals считают плохими, потому что состояние globals и несколько модификаторов могут создать трудно для следования за кодом и странными ошибками. Ко многим агентам, играющим с чем-то, может создать хаос.
Если другая функция должна использовать переменную, Вы передаете ее функции как аргумент.
Также глобальные переменные не являются по сути противными и злыми. Пока они используются правильно нет никакой проблемы с ними.
То, что Вы ищете, технически известно как приправление карри.
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));
Вышеупомянутое не является точно функцией с приправой карри, но оно достигает результата поддержания существующего значения, не добавляя переменные к глобальному пространству имен или требуя некоторого другого объектного репозитория для него.
Вы можете полностью контролировать выполнение функций javascript (и передавать между ними переменные) с помощью пользовательских событий jQuery... Мне говорили, что это невозможно на всех этих форумах, но я получил что-то работающее, что делает именно это (даже с использованием вызова ajax).
Вот ответ (ВАЖНО: это не проверенный ответ, а ответ моего «Эмиля»):
Как получить переменную, возвращаемую несколькими функциями — Javascript/jQuery