2013-08-31 19 views
9

Jaka jest poprawna składnia do przekazywania argumentów do IIFE przechowywanego w zmiennej?Przekazywanie argumentów do IIFE

Przykład poniżej mówi mi, że foo nie jest zdefiniowana, bez względu na jeśli zgłoszę funkcja czy nie:

var bar = (function(foo){ 

    return { 
     getFoo: function(){ 
      return foo; 
     } 
    } 

})(foo); 

console.log(bar.getFoo(1)); 

http://jsfiddle.net/eSTkL/

Odpowiedz

20

Iife jest natychmiast wywoływany. W momencie wywołania przekazujesz mu numer foo, a przypuszczam, że jest nieokreślony.

To, co jest przechowywane w bar, to nie IIFE, ale obiekt zwracany przez IIFE, który nie ma nic wspólnego z foo (oprócz dostępu do niego poprzez zamknięcie). Jeśli chcesz być 1 bla, nie przechodzą tę wartość do getFoo, ale do samego Iife:

var bar = (function(foo){ 

    return { 
     getFoo: function(){ 
      return foo; 
     } 
    } 

})(1); 

console.log(bar.getFoo()); // 1 

Jeśli chcesz getter i setter (funkcje rzeczywiście, getter/setter-like), użyj to:

var bar = (function(foo){ 

    return { 
     getFoo: function(){ 
      return foo; 
     }, 
     setFoo: function(val) { 
      foo = val; 
     } 
    } 

})(1); 

console.log(bar.getFoo()); // 1 
bar.setFoo(2); 
console.log(bar.getFoo()); // 2 
+0

Więc nie można zrobić czegoś takiego jak 'bar (1)', aby zrobić 'foo === 1'? – Johan

+0

Możesz stworzyć metodę podobną do setera w taki sam sposób, w jaki stworzyłeś getter. Wewnątrz tej metody możesz ustawić wartość foo na cokolwiek przechodzisz. Czy próbujesz osiągnąć coś praktycznego, czy tylko próbujesz zrozumieć, jak to działa? – bfavaretto

+0

@Johan Zobacz moją aktualizację dla kodu ustawiającego. – bfavaretto

0

To foo, które przechodzą do funkcji.

2

Numer foo, który przechodzisz do IIFE, nie jest zdefiniowany. Najpierw należy zdefiniować foo w zewnętrznym środowisku zmiennych.

var foo = "foobar"; 

var bar = (function(foo){ 

    return { 
     getFoo: function(){ 
      return foo; 
     } 
    } 

})(foo); 

Albo po prostu zdefiniować go bezpośrednio w pozycji argumentów.

var bar = (function(foo){ 

    return { 
     getFoo: function(){ 
      return foo; 
     } 
    } 

})("foobar"); 

Należy również pamiętać, że jesteś przechodzącą wartość do getFoo(), ale nie jesteś w rzeczywistości używając go w metodzie.

//   v----never gets used 
bar.getFoo(1) 
Powiązane problemy