将论据传递给IIFE

时间:2013-08-31 20:32:38

标签: javascript

将参数传递给存储在变量中的IIFE的正确语法是什么?

以下示例告诉我foo未定义,无论我是否调用该函数:

var bar = (function(foo){

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

})(foo);

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

http://jsfiddle.net/eSTkL/

4 个答案:

答案 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));

为我工作。