如何将匿名函数中定义的局部变量公开到全局空间

How can I expose local variables defined in anonymous function to the global space?

本文关键字:局部变量 空间 全局 定义 函数      更新时间:2023-09-26

我有一个例子,其中变量是在自执行匿名函数中定义的。我想将它们公开到全局空间,以便在匿名函数返回后使用foobar

(function () {
    var foo = 123;
    var bar = function () { /* ... */ };
})();

一个问题是,我不能简单地使用window.foo = 123SomeExistingGlobalObject.foo = 123来公开它,因为我事先不知道匿名函数内部有什么内容。函数内部的内容是动态生成的。

我尝试从该函数返回另一个自执行函数,但也不起作用。这可能吗?

使用揭示模块模式:

var module = (function () {
  var foo = 123;
  var bar = function () {
    console.log('Hallo');
  };
  return { foo: foo, bar: bar }
})();
console.log(module.foo); // 123
module.bar(); // Hallo

DEMO

作为@Andy的替代语法,您也可以使用

var module = (function () {
  var fnpublic = {};
  var fubar = 123;
  fnpublic.foo = 123;
  fnpublic.bar = function () {
    console.log('Hallo');
  };
  return fnpublic;
})();
module.foo; // -> 123
module.bar(); // -> "hallo"
module.fubar; // -> undefined

其他优雅的方法是:

(function() {
  var that = this;   // Pass window global scope
  var private_1 = 1; // Create private variable
  // Create method to expose
  var method = function(number) {
    alert(number + private_1);
  };
  // Expose global_obj 
  that.global_obj = {
    alert: method
  };
 }.call(this));

 // In console now you may type
 global_obj.alert(5);

您也可以使用私有方法。