是否可以访问匿名函数中的函数?

时间:2011-08-14 16:42:05

标签: javascript closures anonymous-function

请考虑以下代码:

(function($) {
  function hello(who)
  {
    console.log('Hello: '+who);
  }
})(jQuery);

$(document).ready(function() {
  hello('World');
});

如何从匿名函数外部访问hello函数?

3 个答案:

答案 0 :(得分:2)

我会做这样的事情

var hello = (function() {
  return function(who)
  {
    console.log('Hello: '+who);
  };
})(jQuery);

$(document).ready(function() {
  hello('World');
});

您从匿名函数返回一个函数,然后您可以在任何您喜欢的范围内存储和访问该函数

答案 1 :(得分:1)

(function($) {
  function hello(who)
  {
    console.log('Hello: '+who);
  }

  $(document).ready(function() {
    hello('World');
  });
})(jQuery);

将所有对hello函数的引用移到范围内。

答案 2 :(得分:1)

假设您最终还想要为此闭包添加其他方法,您可以使用模块模式创建命名空间:

var myAppNamespace = (function($){
  var exports = {}, // the return object
      helloText = 'Hello: '; // private variable

  function concatText() {
    var returnString = '';
    for (var i = 0, il = arguments.length; i < il; i++) {
      returnString += arguments[i];
    }
    return returnString;
  } // private method

  exports.world = 'World'; // public property
  exports.hello = function ( who ) {
    console.log(concatText(helloText, who));
  }; // public method

  return exports; // assign exports to myAppNamespace
}(jQuery));

这里的方法和属性只是为了展示在闭包内私下和公开声明事物的方法的例子。例如:

myAppNamespace.hello(myAppNamespace.world); // -> Hello: World
myAppNamespace.hello('Bob'); // -> Hello: Bob
myAppNamespace.helloText; // undefined
myAppNamespace.concatText; // undefined

另外,我在自执行函数中使用了$参数,以便将jQuery传递给某些内容,您可以在内部使用$来访问jQuery