Много кода, мало объяснений.
function x(){
// some code
function y(){
//some more code
}
}
Выше объявляется y внутри x , поэтому он создается как свойство Переменный объект x каждый раз, когда вызывается x . y доступен только изнутри x , если код внутри x не делает его доступным из других источников.
function z(){
// how do i call function y?
}
Для вызова y изнутри z , оно должно быть доступно в цепочке областей действия z .Это можно сделать, передав его в вызове функции (сделав его свойством объекта переменной z ) или присвоив ему свойство некоторого объекта в цепочке областей действия z .
Если функция должна быть доступна обеим функциям, имеет смысл объявить ее, где к ней могут обращаться как x и z , так и инициализировать z таким образом, что y доступно.например,
var z;
var x = (function() {
function y(){}
z = function() {
// something that calls y;
};
return function() {
// x function body
}
}());
В приведенном выше примере x и z имеют доступ к одной и той же функции y , и она не создается каждый раз х называется.Обратите внимание, что z будет неопределенным до тех пор, пока не будет выполнен код, присваивающий x .
Обратите также внимание, что y равно только доступно для x и z , к ней не может получить доступ никакая другая функция (поэтому y можно назвать закрытой функциейи x и z можно назвать привилегированными функциями).