Посмотрите внимательно потока:
var routes = function() {
var person = {
fname: 'Roger',
lname: 'Federer',
city: 'Paris'
}
var fun = {
getData:function() {
return person
}
}
return fun;
}
var x = routes();
console.log(x.getData());
Сначала вы определили анонимную функцию.
Когда анонимная функция вызывается его:
- определяет объект
person
(локально в своем внутреннем собственном объеме)
Определяет объект fun
(также в своем собственном внутреннем объеме)
Когда он определяет fun
, он также определяет метод getData()
, который возвращает person
- объявлен во внешней области (внутри самой внешней анонимной функции который мы только что описали).
Внешняя самая анонимная функция завершается возвращением fun
.
Затем вы вызываете анонимную функцию. (Via routes()
.)
Вызов routes()
возвращается fun
, что означает, что вы можете сделать routes().getData()
и решает до этого getData:function() {
декларации.
Как мы уже говорили, это возвращает объект person
из области внешней анонимной функции. Он доступен для определения getData()
- поэтому он будет разрешен OK.
Когда вы назвали var x = routes()
вы захватили возвращаемое значение routes()
- что fun
потому что это то routes()
возвращается. Вы только сделали более сложный маршрут, чтобы добраться до x.getData()
. Ничего страшного!
Так короче:
x
является fun
объект, возвращаемый routes()
fun
имеет метод, называемый getData()
, который возвращает person
person
случается быть определен в пределах сферы действия анонимная функция, которую вы выполнили при вызове routes()
(в частности, вы сделали var x = routes();
- что вызвало создание person
).
Надеюсь, это имеет смысл.
Это не «супер очевидный», но код довольно прост в использовании, если вы выполняете его по очереди в порядке выполнения, сохраняя заметку (или на бумаге) областей и значений переменных ,
Update: Другие обеспечивают достойные ссылки для чтения на предмет закрытия JavaScript. Прочтите их. Это будет учить вы что я заявил выше. Они более достойны (ИМХО) на голосование. Мой ответ - просто объяснение исполнения кода, который вы предоставили, а не прохода по закрытию. :)
Начало работы с http://stackoverflow.com/questions/111102/how-do-javascript-closures-work –
Поиск о «Javascript Closure», или вы можете найти статью w3schools на этом. –
читать о закрытии. Ваша функция 'getData' использует' person' var, она «сохраняет ее внутри» и имеет к ней доступ, поэтому вы получаете 'person'. Закрытие - это важные вещи в js, поэтому найдите время, чтобы узнать, как работает тэй. –