2016-10-17 12 views
21

Mam zmienną o nazwie foo i funkcję o nazwie foo.Co będzie odniesieniem, gdy zmienna i funkcja mają tę samą nazwę?

//variable followed by function declaration 
var foo="bar"; 
function foo(){ 
    return "bar"; 
} 
//function declaration followed by variable 
function foo(){ 
    return "bar"; 
} 
var foo="bar"; 
//When I call foo it returns string bar; 
//When I enquired foo() it throws error 

Co się tutaj dzieje? Dlaczego występuje funkcja zastępowania nazwy zmiennej?

+0

oba przypadki zwrócą ciąg "bar". zasadniczo funkcje są podnoszone do górnej części pliku. , więc ciąg "pasek" zastąpi je w obu przypadkach. - nie powinien powrócić niezdefiniowany, powinien wywołać błąd. – aeid

Odpowiedz

15

When I call foo it returns string bar ;

Deklaracje funkcji są hoisted na szczycie ich zakresu. Definicja funkcji została przeniesiona wyżej przez kompilator. A następnie zmienna jest nadpisywana do ciągu znaków.

Code jest równoważna jak

function foo() { 
    return "bar"; 
} 
// Overwriting the value 
var foo = "bar" 

Tak, w obu przypadkach, wyjście będzie 'bar'.

Pamiętaj, że function expressions nie są podnoszone.

Więcej informacji na temat funkcji podnoszenia patrz Javascript function scoping and hoisting

When I enquired foo() it is undefined

foo tutaj nie jest funkcją, to ciąg. Więc foo() wygeneruje błąd

Uncaught TypeError: a is not a function(…)

+0

@Tushkar to spowodowało błąd, to mój błąd stwierdzający nieokreślone foo. W każdym razie dziękuję za odpowiedź. – krtkeyan

0
var foo="bar"; 

var foo = function(){ 
    return "bar"; 
}; 

Są takie same. Nie zapomnij umieścić ; na końcu linii.

+0

Obawiam się, że nie odpowiadasz na pytanie, a brakujące ';' nic nie zmienia. –

1

W języku JavaScript funkcje są przetwarzane po wprowadzeniu odpowiedniego zakresu. Zmienne są przetwarzane, gdy interpreter dostaje się do ich deklaracji. Dlatego w twoim przykładzie funkcje są przetwarzane jako pierwsze, nazwa foo jest używana przez ostatnią funkcję, a następnie nadpisywana przez zmienne.

Zauważ, że jeśli deklarują swoją funkcję jak ten

var foo = function() {} 

to faktycznie nie jest przetwarzany na początku, a także nadpisanie zmienne zadeklarowane wcześniej.

0

obu przypadkach zwróci ciąg „bar” chwyta

javascript zasadzie wszystkie funkcje i umieścić je w górnej części pliku jego nazwie wyciągowej.

więc deklaracja łańcuchowa nadpisze wyrażenie funkcji w obu przypadkach;

2

w jaśniejszym i bardziej jednoznaczny sposób deklarowania zmiennych, ten ostatni będzie uwzględniać:

var foo = "bar"; 
    var foo = function() { 
     return "bar"; 
    }; 
    console.log(foo); 

wyjściowy jest funkcją

i odwrócenie:

var foo = function() { 
    return "bar"; 
}; 
var foo = "bar"; 
console.log(foo); 

ma „bar "jako wynik.

Powiązane problemy