Фрагмент перший:
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 ()' return, що повертає 'b ()', що є нічим, так 's' є нічим (в JavaScript це фактично річ, це 'undefined'. Отже коли ви попросите JavaScript інтерпретувати, що таке тип даних "s", інтерпретатор JavaScript скаже, що "s" є невизначеним.) Як "s" є невизначеним, коли ви попросите JavaScript виконати цей оператор 's ()', ви просите JavaScript виконати функцію, названу як 's', але 's' тут - 'undefined', а не функція, тому JavaScript буде скаржитися: "hey, s - це не функція, я не знаю як робити з цим s ", тоді повідомлення про помилку" Uncaught TypeError: s не є функцією "буде показано 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'. тому, коли Execute 's = a ()', 's' отримає значення, що вказує на b, тобто 's' є псевдонімом 'b' зараз, виклик 's' дорівнює виклику 'b'. тобто 's' - це функція зараз. Виконати 's ()' означає запустити функцію 'b' (те саме, що виконувати 'b ()'), діалогове вікно із зазначенням 'B!' З'явиться (тобто, запустіть 'alert (' B! '); оператор у функції' b ')