2015-07-09 2 views
3

я просто смотрел Дуглас Крокфорд видео и он дал следующее упражнение делать:ПОНИМАНИЕ Крокфорд, которая возвращает функцию с переменным значением

написать функцию, которая при передаче переменной, возвращает функцию, которая , если вызывается, возвращает значение переменной.

так я написал следующую функцию:

function funcky(o) { 
    return function send(o){ // notice the o in send 
     return o; 
    } 
    } 

    var x = funcky(3); 

    console.log(x()); // i get undefined why ?? 

Уведомления о o в посыле. Я программировал javascript какое-то время, но я все еще не понимаю, почему я получаю undefined ??

crockfords раствор следующим образом:

function funcky(o) { 
    return function send(){ 
     return o; 
    } 
    } 

    var x = funcky(3); 

    console.log(x()); // get 3 now . 

теперь, как прийти это решение работает и моя does't? я не вижу большой разницы в моем решении, и ничего явно не так, как я вижу. Может кто-нибудь объяснить, пожалуйста?

+1

Крокфорд возвращает функцию, которая не принимает никаких параметров. Он получает свои параметры от внешней функции. Ваша функция принимает параметры, которые вам нужно будет предоставить. –

ответ

3

Это связано с объемом o. Когда вы пишете:

return function send(o){ // notice the o in send 
    return o; 
} 

Объем o является локальным для функции отправки. Но, если вы пишете:

return function send(){ 
    return o; 
} 

Объем O не является локальным для функции отправки, но является локальным для сферы funcky.

Итак, когда вы пишете function send(o){/*...*/}, что на самом деле происходит то, что o становится аргументом, и нужно будет называться так: funcky()(10), но то, что вы хотите быть в состоянии сделать это funcky(10)().

EDIT:

Для получения дополнительной информации о видимости переменных в JavaScript, пожалуйста, см this very detailed answer on SO.

+0

, так что в основном javascript имеет область видимости функции, но без блока я думаю! –

4

o в send(o){, где вы совершаете ошибку. Он не «наследует» o от аргументов исходного родителя. Помещение внутри этого объявления функции создает новый o внутри новой области этой функции.

send не передается ничего при вызове, и он возвращает свой первый аргумент, чтобы он возвращал undefined.

Ваш код, аннотированный:

function funcky(o) { 
    return function send(o){ // DECLARES NEW VARIABLE, happens to have same name 
     return o; //returns the first argument passed to send 
    } 
    } 

var x = funcky(3); //nothing is passed to the inner function send 

console.log(x()); // undefined due to lack of arguments 

Несколько более наглядным примером того, что на самом деле встречающийся:

function funcky(o) { 
    return function send(someArgument){ 
    return someArgument; //return o; here would find the correct o, the first arg of funcky 
    } 
} 
+0

Получил, чтобы узнать что-то .. спасибо! –

2
function funcky(o) { 
    return function send(o){ // notice the o in send 
     return o; 
    } 
} 

o параметр вашей внутренней функции в тени o первоначально передается funcky.Поэтому, когда вы пишете var x = funcky(3);, x является просто функцией send, которая ожидает возвращения параметра, в закрытии ничего не зафиксировано.

(Другими словами, x не имеет ссылки на оригинал o - 3 в вашем случае, потому что по имени o он вызывает параметр, с которым сам вызов вызывает).

2

Из-за объема.

Функция send переписывает var o во внутренней области.

function funcky(o) { 
// o here is whatever you passed in funcky 
    return function send(o){ 
    // now o here is whatever you pass in send 
    // since you didn't pass anything the result is undefined 
    return o; 
    } 
} 

Проверить этот другой пример

function funcky(o) { 
    return function send(a){ 
    console.log(a); 
    console.log(o); // this o is the parent o 
    return o; 
    } 
} 

var x = funcky(3); 

console.log(x()); 
Смежные вопросы