Первый фрагмент:
function a() {
alert('A!');
function b(){
alert('B!');
}
return b(); //return nothing here as b not defined a return value
}
var s = a(); //s got nothing assigned as b() and thus a() return nothing.
alert('break');
s(); // s equals nothing so nothing will be executed, JavaScript interpreter will complain
оператор 'b ()' означает выполнение функции с именем 'b', которая отображает диалоговое окно с текстом 'B!'
оператор return b (); означает выполнить функцию с именем 'b' и затем вернуть то, что возвращает функция 'b'. но 'b' ничего не возвращает, тогда и этот оператор 'return b ()' ничего не возвращает. Если b () возвращает число, то return b () также является числом.
Теперь 's' присваивается значение того, что возвращает 'a ()', которое возвращает 'b ()', что является ничем, поэтому 's' - это ничто (в JavaScript это действительно вещь, это 'undefined'. Итак, когда вы просите JavaScript интерпретировать, какой тип данных представляет собой 's', интерпретатор JavaScript сообщит вам, что 's' является неопределенным.) Поскольку 's' является неопределенным, когда вы запрашиваете JavaScript для выполнения этого оператора 's ()', вы просите JavaScript выполнить функцию с именем 's', но 's' здесь означает 'undefined', а не функцию, поэтому JavaScript будет жаловаться: "эй, s не функция, я не знаю, как чтобы сделать с этим s ", то сообщение об ошибке" Uncaught TypeError: s is not a function "будет отображаться с помощью JavaScript (проверено в Firefox и Chrome)
Фрагмент два
function a() {
alert('A!');
function b(){
alert('B!');
}
return b; //return pointer to function b here
}
var s = a(); //s get the value of pointer to b
alert('break');
s(); // b() function is executed
теперь функция 'a' возвращает указатель / псевдоним функции с именем 'b'. поэтому при выполнении 's = a ()' 's' получит значение, указывающее на b, то есть 's' теперь является псевдонимом 'b', вызов 's' равен вызову 'b'. ie 's' теперь функция. Execute 's ()' означает запуск функции 'b' (то же самое, что выполнение 'b ()'), диалоговое окно, показывающее 'B!' появится (т. е. выполнение оператора 'alert (' B! '); в функции' b ')