2010-10-15 9 views
14

Wiele osób mówi, że to jest pytanie zbyt wiele w komentarzach, co sprawiło mi wahała się zapytać, ale wciąż nie znalazłem rozwiązanie w swoich odpowiedziach, głównie dlatego, że (1) są one zazwyczaj przy użyciu jQuery oraz (2) pytania zazwyczaj zawierają informacje techniczne, których nie rozumiem.JavaScript: Czy jest możliwe, aby przekazać zmienną do funkcji wywołania zwrotnego, który jest przypisany do zmiennej?

Mam funkcji ze zmienną wewnątrz. Zmienna ma przypisaną funkcję. Jestem pewien, że ta koncepcja nie jest wyłącznie dla technologii AJAX, ale to jest kontekst Używam go, czy to robi różnicę.

function iClick(this) 
{ 
    var foo = "I would like to pass this."; 

    ajax.onreadystatechange = function (foo) { alert(foo); } 
} 

Chcę przekazać zmienną do funkcji. Ponieważ jednak nie ma oryginalnej deklaracji funkcji, w jaki sposób określić parametry? Czy mogę to zrobić?

+4

+1. Pytam, czy przeszukałeś, ale nie znalazłeś tego, czego szukasz. Wielu z nas pochodzi z nie-programistycznych środowisk, więc niektóre niuanse informatyczne, a nawet podstawy często wymagają wyjaśnienia (przynajmniej w moim przypadku). – orolo

Odpowiedz

18

Tylko nie deklarują tę zmienną jako parametr w anonimowej funkcji, takich jak to:

function iClick(this) 
{ 
    var foo = "I would like to pass this."; 
    ajax.onreadystatechange = function() { alert(foo); } 
} 

Kiedy zadzwonisz pierwszy parametr foo to wszystko co nazywając że zwrotna przechodzi w to foo wewnątrz funkcji . Jeśli chcesz odwołać się do zmiennej zadeklarowanej wcześniej po prostu to zrobić, upewnij się nie użyć parametru o tej samej nazwie.

+2

Oh! Myślałem, że to będzie poza jego zasięgiem. Dzięki! – Tarik

+3

@Tarik - JS ma zasięg i funkcje. Funkcje mają dostęp do zmiennych w zakresach nadrzędnych nawet po zwróceniu funkcji rodzica. –

+0

@PeterAjtai Co jeśli wewnątrz ajax.onreadystatechage Chcę przypisać nową wartość do foo. Czy będzie to widoczne w iClick()? na przykład funkcja iClick (this) { var foo = "Chciałbym to przekazać."; ajax.onreadystatechange = function() {foo = "Wartość zmieniona"; } console.log (foo); // Czy wydrukowałby "Wartość zmienioną"? } – Ali

15

Można utworzyć funkcję jak ten

var c="hello"; 

(function(b){ 
    alert(b) 
})(c); 

rezultat byłby „cześć”

+0

jest to odpowiedź, i jest to bardzo przydatne, gdy chcesz przeanalizować zmienną z zewnątrz w asynchroniczne wywołanie zwrotne, takie jak 'db.query' w węzeł na przykład –

+1

@ JoãoPimentelFerreira Bardzo prosty w testowaniu. dziwne, o co pytasz? Ale odpowiedzieć. Zmienna c będzie tą, która jest w zasięgu, która jest wersją lokalną dla funkcji. –

+1

@ JoãoPimentelFerreira Oto prosty test. https://jsfiddle.net/qon4cwhn/ Zobaczysz, że wartość c jako globalna nie jest modyfikowana. –

3

Można też to zrobić, ale może to nie jest konieczne:

function iClick(this) 
{ 
    var foo = "I would like to pass this."; 

    ajax.onreadystatechange = (function(thevar) { 
     return function() { alert(thevar); }; 
     })(foo); 
} 
0

wierzę ci chciał coś takiego

function handleAjaxRequest(params) { 
    var context = {'b':'inner', 'c': params['c']}; 
    function rendered(html) { 
     // render 
    } 
    function gotPart(part) { 
     context['a'] = part; 
     engine.render(context).addCallback(rendered); 
    } 
    ajax.getPart(params).addCallback(gotPart); 
} 
1

Jak @John Hartsock mowa, odpowiedź, że każdy powinien pamiętać, jest to naprawdę

var c="hello"; 

(function(b){ 
    alert(b) 
})(c); 

I to jest bardzo ważne na przykład w for pętli, gdy jest jakaś funkcja asynchroniczne wewnątrz niego, bo inaczej nie dostaniesz poprawny przedmiot.

Powiedz mi, co z tego wyjdzie?

for (var i=0; i<5; i++){ 
 
    setTimeout(function(){ 
 
    console.log(i); 
 
    }, 1000); 
 
}

dokładnie: wszystkie 5, gdyż jeśli wszystkie liczniki są uruchamiane po 1 sekundzie, zmienne i już w wartości 5.

Ale jeśli używasz samodzielne powoływać anonimową funkcję (SIAF) tak

for (var i=0; i<5; i++){ 
 
    (function (j){ 
 
    setTimeout(function(){ 
 
     console.log(j); 
 
     }, 1000); 
 
    })(i); 
 
}

to zadziała, ponieważ za każdym razem funkcja jest wywołany, uruchamia kolejną instancję Funkcja i jak każda funkcja ma swoje własne zmienne lokalne. Nie ograniczam się do zdefiniowania funkcji, uruchamiam ją również od razu (przez (); na końcu), ale wewnętrznie zostanie utworzone nowe wystąpienie funkcji z różnymi wewnętrznymi zmiennymi lokalnymi, ponieważ analizuję funkcję inną zmienną za każdym razem, gdy go uruchamiam.

Powiązane problemy