将参数传递给存储在变量中的IIFE的正确语法是什么?
以下示例告诉我foo
未定义,无论我是否调用该函数:
var bar = (function(foo){
return {
getFoo: function(){
return foo;
}
}
})(foo);
console.log(bar.getFoo(1));
答案 0 :(得分:32)
IIFE立即被调用。您在调用时将foo
传递给它,我想它是未定义的。
存储在bar
中的不是IIFE,而是IIFE返回的对象,与foo没有任何关系(除了通过关闭访问它)。如果您希望foo为1
,请不要将该值传递给getFoo
,而是传递给IIFE本身:
var bar = (function(foo){
return {
getFoo: function(){
return foo;
}
}
})(1);
console.log(bar.getFoo()); // 1
如果你想要一个getter和一个setter(实际上是getter / setter-like函数),请使用:
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
答案 1 :(得分:4)
您传递给IIFE的foo
未定义。您应该首先在外部变量环境中定义foo
。
var foo = "foobar";
var bar = (function(foo){
return {
getFoo: function(){
return foo;
}
}
})(foo);
或者直接在参数位置定义它。
var bar = (function(foo){
return {
getFoo: function(){
return foo;
}
}
})("foobar");
另请注意,您将值传递给getFoo()
,但实际上并未在方法中使用它。
// v----never gets used
bar.getFoo(1)
答案 2 :(得分:0)
你传递给函数的是foo
。
答案 3 :(得分:0)
为什么不简单:
var bar = (function(){
return {
getFoo: function(foo){
return foo;
}
}
})();
console.log(bar.getFoo(1));
为我工作。