2015-12-08 2 views
1

Я понимаю, что вызов маршрутов() и присваивание х присваивает этому объекту интерес к нему. Но вызов x.getData() возвращает person.How может вернуть объект person, который является локальным для функции маршрутов? Меня особенно интересуют последние две строки.Как работает этот javascript-код?

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()); 
+1

Начало работы с http://stackoverflow.com/questions/111102/how-do-javascript-closures-work –

+1

Поиск о «Javascript Closure», или вы можете найти статью w3schools на этом. –

+2

читать о закрытии. Ваша функция 'getData' использует' person' var, она «сохраняет ее внутри» и имеет к ней доступ, поэтому вы получаете 'person'. Закрытие - это важные вещи в js, поэтому найдите время, чтобы узнать, как работает тэй. –

ответ

3

Речь идет о JS затворов и лексические области видимости: Ваша функция getData внутри fun объекта имеет доступ к области применения routes объекта. Это подробно объясняется в книге «Вы не знаете JS».

https://github.com/getify/You-Dont-Know-JS/blob/master/scope%20&%20closures/ch5.md

+1

Очень полезная ссылка. +1 от меня. – wally

2

Посмотрите внимательно потока:

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. Прочтите их. Это будет учить вы что я заявил выше. Они более достойны (ИМХО) на голосование. Мой ответ - просто объяснение исполнения кода, который вы предоставили, а не прохода по закрытию. :)

Смежные вопросы