2013-08-31 50 views
9

Cú pháp chính xác để chuyển đối số cho một IIFE được lưu trữ trong một biến là gì?Truyền đối số cho một IIFE

Ví dụ dưới đây nói với tôi rằng foo không được định nghĩa, bất kể trên nếu tôi gọi hàm hay không:

var bar = (function(foo){ 

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

})(foo); 

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

http://jsfiddle.net/eSTkL/

Trả lời

20

IIFE là ngay lập tức được gọi. Bạn đang chuyển số foo tới địa chỉ yêu cầu và tôi cho rằng nó không được xác định.

Những gì được lưu trữ trong bar không phải là IIFE, nhưng đối tượng được trả về bởi IIFE, không liên quan gì đến foo (bên cạnh việc truy cập thông qua đóng). Nếu bạn muốn foo là 1, không vượt qua giá trị đó để getFoo, nhưng đến IIFE bản thân:

var bar = (function(foo){ 

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

})(1); 

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

Nếu bạn muốn có một phương thức getter và setter (chức năng thực sự, getter/setter-like), sử dụng này:

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

Vì vậy, không thể làm điều gì đó như 'bar (1)' để tạo 'foo === 1'? – Johan

+0

Bạn có thể tạo một phương thức giống như setter giống như cách bạn tạo một getter. Bên trong phương thức đó, bạn có thể đặt giá trị của foo thành bất kỳ thứ gì bạn vượt qua. Bạn đang cố gắng thực hiện một cái gì đó thực tế, hoặc chỉ cố gắng để hiểu nó hoạt động như thế nào? – bfavaretto

+0

@Johan Xem cập nhật của tôi cho mã setter. – bfavaretto

0

Đây là foo mà bạn đang đi vào hoạt động.

2

foo mà bạn đang chuyển đến IIFE không được xác định. Bạn nên xác định foo trong môi trường biến bên ngoài trước tiên.

var foo = "foobar"; 

var bar = (function(foo){ 

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

})(foo); 

Hoặc chỉ cần định nghĩa nó trực tiếp ở vị trí đối số.

var bar = (function(foo){ 

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

})("foobar"); 

Cũng lưu ý rằng bạn đang đi qua một giá trị cho getFoo(), nhưng bạn không thực sự sử dụng nó trong phương pháp này.

//   v----never gets used 
bar.getFoo(1) 
Các vấn đề liên quan