18

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

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

var bar = (function(foo){

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

})(foo);

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

http://jsfiddle.net/eSTkL/

4

5 回答 5

42

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 的函数),请使用以下命令:

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
于 2013-08-31T20:36:09.550 回答
4

foo你传递给 IIFE 的那个没有定义。您应该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)
于 2013-08-31T20:35:19.090 回答
4

为什么不简单:

var bar = (function(){

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

})();

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

为我工作。

于 2018-10-23T16:13:16.610 回答
0

它是foo你传递给函数的那个​​。

于 2013-08-31T20:35:18.177 回答
0

const bar = (foo => ({ getFoo: _ => foo }))("foobar");

console.log(bar.getFoo())

于 2021-12-29T08:22:47.843 回答