2015-01-01 2 views
1

Может ли кто-то объяснить, почему «myPet = pet (Vivie)»; на самом деле не вызывает функцию домашнего животного, но myPet() делает? Это отличается от языков программирования, которые я узнал как Java. Благодарю.Путаница вызова функции Javascript

var pet = function(name) {     
    var getName = function() {  
    return console.log(name);    
    } 
    return getName;     
}, 

myPet = pet("Vivie"); // ???????? 
myPet(); // Returns "Vivie" 
+0

'myPet = домашнее животное (Виви),' 'называет pet', но это не вызывает' getName'. –

ответ

1

Если исходить из языка, который не поддерживает первые функции класса, то это может привести к путанице, когда вы сталкиваетесь с одним, что делает. A Функция первого класса - это функция, которая может быть передана функции или возвращена из функции так же, как если бы это были обычные данные, такие как строка или число. Следующий код должен пролить некоторый свет:

var pet = function(name) { // assign anonymous func to pet    
    var getName = function() { // assign nested anonymous func to getName 
    console.log(name);  // prints to console; no return value    
    }; 
    return getName;   // return getName value: func definition 
}; 

myPet = pet("Vivie");  // assign getName value to myPet 
myPet();      // appending() invokes defined func 

«Виви» получает переданные функции, что животное держит, но console.log() печатает его! Это достигается с помощью функции, известной как закрытие . Поскольку name существует в непосредственной внешней среде вложенной функции, переменная привязывается к ней и продолжает существовать даже после выполняет внешнюю функцию (содержащуюся в домашнем животном).

О console.log(), обратите внимание, что некорректно записывать его как часть оператора return, поскольку метод ведения журнала никогда не возвращает значение; он просто печатает на консоли. Так, с помощью следующего кода:

var pet = function(name) {     
    var getName = function() {  
    return console.log(name);    
    } 
    return getName;     
}, 

myPet = pet("Vivie"); 
console.log(typeof myPet()); 

в последнем заявлении, myPet() выполняет вызывая «Виви» для печати на консоль, но она не возвращает ничего . Таким образом, typeof возвращает «undefined», и этот результат также печатается на консоли. См. http://jsfiddle.net/yu75k5tz/.

Возвращаясь к основной теме передачи функции, рассмотрите предыдущий фрагмент снова. Существует альтернативный и более экономичный способ достижения того же результата с помощью вызова функции формирования цепочки следующим образом:

pet("Vivie")();

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

Наконец, конечные полуколонки определений функций могут отображаться нечетными, но они синтаксически правильны. Каждая анонимная функция назначается переменной, поэтому каждый из этих полуколоней фактически завершает оператор присваивания.

Живая демо здесь: http://jsfiddle.net/kLghedp3/8/

0

pet() возвращает функцию и присваивает его myPet. Если вы хотите, чтобы вызвать функцию, которая возвращает pet() вы также можете сделать: pet('Vivie')();

0

pet() возвращает функцию и присваивает его к переменной myPet. Таким образом, Mypet() фактически вызывает функцию. Если вы хотите, чтобы вызвать функцию, что домашнее животное() возвращает вы также можете сделать: pet("some name")();

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

Если закомментировать myPet = pet("Tushar"); код не побежит, потому что mypet() ничего не назначено. Попробуй.

var pet = function(name) {     
 
    alert(name);     
 
}, 
 

 
myPet = pet("Tushar"); 
 
myPet();

0

Если вы выполнить код в консоли по одному, вы получите ответ, вероятно.

myPet = pet("Vivie"); 

выше линии назначая функцию myPet которой ч тело, как пыльник

function() {  
    return console.log(name); 
    } 

здесь значение названия приходит от закрытия функции домашнего животного.

, когда вы звоните myPet это вызов этой функции с помощью name as Vivie.

Так что если вы беспокоитесь о том, что вы работаете pet, это не вызов метода, потому что в pet функция no-where была вызвана. Он просто возвращает само определение функции.

Если вы хотите pet функцию для печати retsult, определить его как ниже

var pet = function(name) {     
    var getName = function() {  
    return console.log(name);    
    } 
    return getName();     
} 
0

По этой линии myPet = pet("Vivie"); вы назначаете функцию вместе с параметром в вар myPet. Таким образом, myPet станет еще одной функцией

var getName = function() {  
console.log(name);    
    } 

Следовательно, вы должны позвонить myPet(); как функцию для возврата.

0

Это разница между Js функций и переменных функций, следующее очень хорошее объяснение этих

JS Functions Vs Variable Functions

вы можете вызывать эту функцию, изменив свой код, как:

var pet = function(name) {     

    return console.log(name);    

}; 

pet("test1"); 
0

Что вы делали, когда вы вызывали pet, возвращали функцию и задавали строку «Vivie» в переменной с областью действия name. Таким образом, ваша переменная myPet получает значение getName, функцию, печатающую значение переменной имени области действия. К тому времени, когда вы вызвали myPet, вы уже вызывали функцию, возвращаемую pet, которая является getName, печатая переменную имени с заданным значением «Vivie».

Надеюсь, что это поможет очистить его. :)

1

javascript функции обрабатываются как DATA. Таким образом, вам разрешено использовать функции как переменные.

В следующей строке

myPet = pet("Vivie"); 

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

Но когда вы код это, функция

myPet(); 

вы звоните myPet() [возвращенный функцией от любимца]. И это точный myPet, который вы получили после того, как вы назначили домашнее животное.

Именно по этой причине вы код myPet(); вызывает функцию.

Теперь Вот интересная вещь,

Когда вы код этого

var pet = function(name) {     
    return console.log(name);     
}, 

myPet = pet("Vivie"); 

это работает !!!! Почему он работает тогда ???

Здесь, когда вы звоните, домашнее животное Функция it it console закрывает ваше имя и возвращает консоль. Он не возвращает никакой функции.

Но в вашем коде в myPet вы получаете функцию.

Позволяет проверить то, что мы понимаем, видя тип возвращаемого объекта из любимца,

В вашем случае:

var pet = function(name) {     
    var getName = function() {  
    return console.log(name);    
    } 
    return getName;     
} 

var myPet = pet("Vivie"); 
console.log(typeof myPet); // consoles : function. 

Вы вызываете любимца, но вам ничего не выполняют внутри возвращаемой функции. Скорее вы говорите, что вы можете выполнить эту возвращенную функцию, используя myPet.

Другой случай:

var pet = function(name) {     
    return console.log(name);     
} 

var myPet = pet("Vivie"); // consoles : Vivie 
console.log(typeof myPet); // consoles : undefined 

Сначала вы выполняете домашнее животное и вернуть консоль, которая почему, когда вы просите TYPEOF myPet вы не получите какой-либо определенный тип.

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

myPet = pet("Vivie")(); 

Мораль:

myPet = pet("Vivie"); 

Здесь myPet относятся к домашним животным . И

myPet(); 

здесь myPet вызывает любимца.

Ссылки:typeof

0

Почему вы думаете, что myPet = pet("Vivie"); не вызывает функцию pet? pet, очевидно, вызывается и возвращает новую функцию, которая назначается myPet.

Теперь вернитесь к своему коду.

myPet = pet("Vivie"); // ???????? 

Ну, это ничего не печатает. Он просто возвращает другую функцию. Это называется currying. Вы можете узнать больше о выделке here

myPet(); // Returns "Vivie" 

Причина, почему она возвращает «Виви» происходит потому, что домашнее животное сформировало закрытия и возвращаемый getName функция находится в области видимости. Таким образом, getName может видеть и фиксировать значение аргумента pet (в данном случае «Vivie») и сохранить его. То, что myPet() действительно ссылается на определение getName.Вы можете узнать больше о замыканиях here

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