2017-03-24 8 views
5
var f=function foo() 
{ 
console.log("hello"); 
}; 

f(); 
foo(); 

To daje błąd jako: "Wyjątek: ReferenceError: foo nie jest zdefiniowana"Dlaczego nie jest możliwe uzyskanie dostępu do funkcji javascript przez jej oryginalną nazwę po przypisaniu jej do innego var?

Ale "foo" jest zdefiniowany. Dlaczego tak się dzieje? Wiem, że jest to wyrażenie funkcji i "f()" jest używane, aby uzyskać dostęp do tej funkcji. Ale to nie jest anonimowa funkcja, mam nazwę dla tej funkcji. Dlaczego nie mogę uzyskać dostępu do funkcji, używając jej nazwy?

+2

Patrz [MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/function#Named_function_expression) W przypadku wyrażenia funkcji, jeśli nazwiesz funkcję, wtedy nazwa jest dostępna tylko w treści funkcji, a nie na zewnątrz. – abhishekkannojia

+1

W js wszystkie funkcje są zmiennymi. Ale w twoim przypadku foo() jest przypisane do f. foo() otrzyma błąd odniesienia, ponieważ nie jest zdefiniowany. –

+0

foo nie jest zdefiniowane. f jest zdefiniowane. –

Odpowiedz

6

MDN - funkcja wyrażenie

składnia

var myFunction = function [name]([param1[, param2[, ..., paramN]]]) { 
    statements 
}; 

The function name. Can be omitted, in which case the function is anonymous. The name is only local to the function body.

2

Jesteś utożsamiając funkcja wyrażenia z deklaracji funkcji.

Ten deklaruje zmienną foo i przypisuje anonimową funkcję do niego:

var foo = function() {}; 

Ten deklaruje funkcję bar w bieżącym zakresie:

function bar() {}; 

Ten deklaruje zmienną baz i przypisuje go do funkcja o nazwie qux:

var baz = function qux() {}; 

Należy zauważyć, że w tym przypadku funkcja nie jest zadeklarowana w tym zakresie. Deklarowana jest tylko zmienna. Tak się składa, że ​​właściwość name tej funkcji zostanie ustawiona na qux.

Zobacz this question.

Edit: kod bloki Edit: dodano istotne ogniwo

Powiązane problemy