2011-09-22 44 views

回答

5

自调用函数返回一个对象与物业hi,该对象未添加到全球范围,这样就可以直接使用属性。把结果的函数的变量:

var o = 
(function(){ 

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

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

})(); 

使用属性调用该函数将只返回包含的变量a的功能,所以你必须从函数调用的返回值调用的函数包含警报:

o.hi()(); 

演示:http://jsfiddle.net/Guffa/9twaH/

0
var obj = (function(){ 

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

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

})(); 

obj.hi() 
+0

取代“return a;”只用“a”就行了。 –

0

您有匿名函数的返回值分配给在当前范围内的变量:

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

有两种基本方式:

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

+0

这是真的。这个例子有点有限。通常我创建一个全局变量作为顶级命名空间,并在此基础上构建,以最大限度地减少DOM污染 –

+0

jQuery是否使用第二个将其$'方法暴露给全局范围,因为当我查看源代码时,它看起来不像像第一个? – John

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

或者你可以换你的“喜”功能在IIFE是这样的...

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

})(); 

myFunction.hi();