如何从匿名自执行函数中暴露函数?

8
 (function(){
   var a = function () {
     alert("hey now!! ");
   };
   return {"hi":function(){return a;}};
 })();

 hi();

这段代码无法运行。如何暴露一个函数?

7个回答

6
自执行函数返回一个带有属性 hi 的对象,这个对象不会被添加到全局范围内,因此您可以直接使用该属性。将函数的结果放入变量中:
var o =
(function(){

  var a = function (){
    alert("hey now!! ");
  };

  return {"hi":function(){return a;}};

})();

使用属性调用函数只会返回变量a中包含的函数,因此您必须调用函数的返回值才能调用包含警报的函数。
o.hi()();

Demo: http://jsfiddle.net/Guffa/9twaH/


6
有两种基本方式:
var MyNameSpace = (function(){

     function a (){
       alert("hey now!! ");
     };

     return {a: a};

})();

MyNameSpace.a();

或者

(function(){

     function a (){
       alert("hey now!! ");
     };

     MyNameSpace = {a: a};

})();

MyNameSpace.a();

我更喜欢第二种方式,因为它看起来更加简洁。

这被称为“揭示模块模式”,你可以阅读相关资料以更好地理解它 :)

https://addyosmani.com/resources/essentialjsdesignpatterns/book/#revealingmodulepatternjavascript


1
请注意,第二种方法创建了一个全局变量,而第一种方法在周围的作用域中创建了一个变量(可能是全局的,也可能不是)。 - nnnnnn
那是真的。这个例子有点局限。通常我会创建一个全局变量作为顶级命名空间,并在此基础上构建,以最小化DOM污染。 - Martin Jespersen
jQuery是否使用第二种方法将其$方法暴露到全局作用域中,因为当我查看源代码时,它看起来不像第一种方法? - John
您的链接已经失效并且指向了恶意软件。 - Joe Shanahan

0
 var obj = (function(){

 var a=  function (){
    alert("hey now!! ");
 };

 return {"hi":function(){return a;}};

 })();

 obj.hi()

0

你必须将匿名函数的返回值分配给当前作用域中的变量:

var f = (function() {
    var a = function() {
        alert("hey now!! ");
    };
    return {
        "hi": function() { return a; }
    };
})();
f.hi()();

0

它?

(function(){
   var a = function () {
     alert("hey now!! ");
   };
   return {"hi":function(){return a;}};
 })().hi()();

0

我想要暴露函数而不是它的代码,语法应该是这样的

var obj2 = (function(){

     var a=  function (){
        alert("hey now!! ");
     };

 return {"hi":a};

 })();

alert(obj2.hi());

0
或者你可以像这样将你的 'hi' 函数包装在一个 IIFE 中...
var myFunction = (function(){
   var a = function () {
     alert("hey now!! ");
   };
   return {
       "hi": (function(){
           return a;
       }())
   };

 })();

 myFunction.hi();

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