传递参数至立即执行函数(IIFE)

24

如何正确传递参数给存储在变量中的IIFE?下面的示例告诉我无论是否调用函数,foo都未定义:

var bar = (function(foo){

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

})(foo);

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

http://jsfiddle.net/eSTkL/

5个回答

49

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

那么像 bar(1) 这样的操作就不能使得 foo === 1 吗? - Johan
你可以像创建getter一样创建一个类似setter的方法。在该方法内部,你可以将foo的值设置为任何你传递的值。你是想实现某些实际功能,还是只是想了解它的工作原理? - bfavaretto
回答你的问题,这是两者兼而有之。我试图模拟一个“类”,只公开其中的一部分。但你给了我足够的信息来解决问题。谢谢! - Johan

5
为什么不简单地这样做:
var bar = (function(){

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

})();

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

对我来说可行。


1
谢谢@Soupedenuit,这确实应该是被接受的答案 :) - mike652638

5

你传递到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)

1

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

console.log(bar.getFoo())


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

0

你传递到函数中的是foo


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接