Факт: когда вы делаете var inner = function() { console.log(x); }
в вашей первой строке, x
не определен. Зачем? Потому что внутри вашей функции inner
нет локального объявления x (что было бы сделано с var x = something
). Затем среда выполнения будет выглядеть в следующей области, то есть в глобальной области. Существует также не объявление x
, поэтому x
также не определено там.
Единственные места, где есть переменная, называемая x
, находятся внутри каждого из следующих 4 IIFE. Но внутри IIFE каждый x
- это другая переменная, в разной степени. Итак, если вы хотите, чтобы console.log()
x
, определенный внутри каждого IIFE, вы принимаете неправильный подход.
Имейте в виду, что при определении inner
вы захватываете среду внутри закрытия функции. Это означает, что любое значение, которое могло бы иметь x
(в объявлении функции), было бы доступным значением переменной x
позже, когда будет использоваться функция inner
. Тот факт, что ваш x
не определен, является только аксессуаром и не является тем, что вызывает нежелательное поведение.
Итак, что же происходит, что при вызове inner
функции внутри любой из ваших IIFEs, то x
упоминается внутри объявление функции inner
это захваченная ценность того, что x
имел в качестве значения, когда функция была определена, а не значение, которое x
теперь находится в области, где функция в настоящее время называется. Это то, что называется лексической области.
Чтобы решить эту проблему, вы должны передать значение, которое вы хотите console.log()
внутри функции inner
в качестве параметра функции inner
, а так:
var inner = function(x) { console.log(x); }
// test 1
(function(cb) { var x = 123; cb(x); })(inner);
Какая проблема вы пытаетесь решить? переменные в функции являются локальными для этой функции. – Hrishi
Какой странный комментарий, почему это имеет значение, в чем проблема? ОП задал вопрос низкого уровня JS, который имеет прямой ответ. – Adam
JavaScript имеет * лексический * объем, а не динамическую область. –