У JavaScript функцыі таксама з'яўляюцца аб'ектамі. Гэта значыць іх можна перадаваць і прысвойваць як і любыя іншыя аб'екты. Адзін, часта выкарыстоўваемы варыянт, гэтай магчымасці - перадача ананімнага метада як функцыі зваротнага выкліку іншай, магчыма асінхроннай функцыі.
function foo() {}
У вышэй прыведзеным прыкладзе функцыя уздымаецца перад тым як пачынаецца выконванне праграмы; Такім чынам, яна даступная паўсюль у зоне бачнасці, у якой яна была аб'яўлена, нават калі выклік адбываецца да фактычнага аб'яўлення ў кодзе.
foo(); // Працуе, бо функцыя будзе створана да выконвання кода
function foo() {}
var foo = function() {};
У гэтым прыкладзе пераменнай foo прысвойваецца ананімная функцыя.
foo; // 'undefined'
foo(); // уздыме TypeError
var foo = function() {};
Праз тое, што var - гэта аб'яўленне якое уздымае імя пераменнай foo перад тым
як код будзе выкананы, foo будзе ўжо аб'яўленым калі ён пачне выконвацца.
Але так як прысвойванні адбываюцца толькі пад час выконвання, значэнне foo
будзе змоўчанным (undefined) да выконвання адпаведнага кода.
Яшчэ адзін выбітны выпадак - прысвойванне іменавай функцыі.
var foo = function bar() {
bar(); // працуе
}
bar(); // ReferenceError
Тут, bar не даступны ў знешнім скоўпе, бо функцыя толькі прысвойваецца пераменнай
foo; аднак, унутры bar, імя даступнае. Так адбываецца праз асаблівасці працы
з прастранствамі імён у JavaScript - імя функцыі заўсёды
даступнае ў лакальным скоўпе функцыі.