2015-12-21 17 views
6

Na to pytanie można odpowiedzieć gdzie indziej, ale nie byłem nawet pewien, jak rozpocząć wyszukiwanie odpowiedzi. Jestem nowy w JavaScript, więc ten jest dla mnie trudny do zrozumienia.Zwracanie funkcji Narzędzia do Chrome Chrome

Biorąc pod uwagę następujący kod:

function multiple(n) { 
    function f(x) { 
     return x * n; 
    } 
    return f; 
} 
var triple = multiple(3); 
var quadruple = multiple(4); 

Kiedy mijam następujących do konsoli:

console.log(triple(5)); 

mam co się spodziewać, czyli 15. Podobnie z dowolnej liczby, to będzie być potrojone (lub czterokrotnie, jeśli użyłem drugiej funkcji).

Ale kiedy wpisać potrójne do konsoli pojawia się następujący kod:

f(x) { 
    return x * n; 
} 

nie powinno zwrot konsoli ...

f(x) { 
    return x * 3; 
} 

... od 3 jest zakodowana w funkcja dzięki następującym kodem:

var triple = multiple(3); 
+5

Odpowiedziałeś na pytanie, 3 nie jest "zakodowane w" f, przekazujesz je jako parametr. Konsola po prostu pokazuje źródło dla funkcji, którą ma. Czy w Twoim źródle masz x * 3. – pvg

+0

jest to tzw. [Zamknięcie] (https://www.wikiwand.com/en/Closure_ (computer_programming)). Zobacz także ["Środowiska leksykalne: teoria powszechna"] (http://dmitrysoshnikov.com/ecmascript/es5-chapter-3-1-lekoniki-techniczne-społeczne-theoria/) – user2683246

Odpowiedz

3

3 jest nie zakodowany na stałe w funkcji. Kod f odnosi się do zmiennej n, a nie do numeru 3.W kodzie, zdarza się tak, że nie ma sposobu, aby zmodyfikować n, ale wyobraź sobie jakiś kod, gdzie nie jest sposób modyfikować n:

function multiple(n) { 
    function f(x) { 
     return x * n; 
    } 
    function modifyN(newN) { 
     n = newN; 
    } 
    return { f: f, modifyN: modifyN }; 
} 
var resultFor3 = multiple(3); 
var triple = resultFor3.f; 
var modifyTripleN = resultFor3.modifyN; 

Jak widać n nie jest zakodowane; nie różni się od żadnej innej zmiennej. W twoim konkretnym przykładzie nie ma możliwości modyfikacji n po zakończeniu multiple, ale to nie czyni wartości wewnątrz zamknięcia utworzonego przez wywołanie multiple w jakikolwiek sposób "zakodowane na sztywno".

2

dobrze, to jest takie samo jak to, gdyby trzeba było:

var n = 3; 
    function f(x) { 
    return n * x; 
    } 

Jeśli zalogujesz f widać funkcji powyżej, ale kiedy to nazwać n dostanie swoją wartość z najbliższego zmiennej o nazwie n w łańcuchu zasięgu, w naszym przypadku n = 3 wartość dla n zadeklarowane w zasięgu globalnym.

Nie wiem dokładnie, w jaki sposób silnik JS przechowuje n zmienną wewnątrz tego zamknięcia (w przypadku zamknięcia utworzony przez funkcję multiple), ale to, co jest ważną rzeczą jest to, że zmienne są wewnątrz zamknięcia zapisane przez reference nie według wartości.

2

Wpisując triple po prostu pokazuje kodu źródłowego swojej funkcji.

od 3 jest zakodowana w funkcji mocy następującego kodu

To jest niepoprawny oświadczenie. Nie zmieniasz kodu źródłowego funkcji. Aby zmienić kod źródłowy, musiałbyś przedefiniować całą funkcję. Wszystko, co robisz, to przekazywanie parametru. Konsola podaje poprawne wyniki.

Podczas przekazywania parametru do funkcji, na poziomie wyższym, w czasie wykonywania, szuka się tylko wartości zapisanej pod adresem pamięci dla tej zmiennej (lub czegoś podobnego). Ale to nie jest przepisywanie kodu źródłowego funkcji.

Powiązane problemy