2013-07-24 120 views
1

此代码存在于swipe.js库中。我试图对其进行定制。返回之前的评论说'暴露了Swipe API',但我不确定这意味着什么。这个swipe.js函数返回什么?

function Swipe(container, options) { 

... 

//everything that makes the library work, including a setup() function 

... 


    //expose the Swipe API 
    return { 
    setup: function() { 

     setup(); 

    }, 
    slide: function(to, speed) { 

     // cancel slideshow 
     stop(); 

     slide(to, speed); 

    }, 
    prev: function() { 

     // cancel slideshow 
     stop(); 

     prev(); 

    }, 
    next: function() { 

     // cancel slideshow 
     stop(); 

     next(); 

    },...some more stuff 
} 

返回值是数组吗?数组列表?举例来说,我实例化一个新的滑动对象window['aNewSwipeObject'] = Swipe($theDOMElement);,我调用setup()这样的函数window['aNewSwipeObject'].setup()调用了什么setup()?返回上面的setup(),或Swipe()函数返回的匿名函数中的setup()?

+1

对象文本! – adeneo

回答

1

它返回一个对象,其中每个属性是一个匿名函数的引用。

这是封装/隐藏数据的简便方法。 Swipe函数中存在私有函数(您可以在JavaScript中嵌套函数),并且返回的对象文字的各个属性仅仅是对调用这些私有函数的匿名函数的引用。

这样,只有Swipe函数才能访问这些私有的内部函数。

当你在对象上调用setup,它调用的公共职能,这反过来,调用内部setup()功能,只是Swipe函数中使用(由对象的setup属性引用)。

这里的东西,使得它清除:

function myAPI(options) { 

    function privateFunction1() { 
     ... 
    } 

    function privateFunction2() { 
     ... 
    } 

    function privateFunction3() { 
     ... 
    } 

    return { 
     publicFunction1: privateFunction1, 
     publicFunction2: function() { 
      //some extra code 
      privateFunction2(); 
     }, 
     publicFunction3: function() { 
      ... 
     } 
    }; 
} 

现在,你可以通过执行获得单独的实例:

var myAPIObject = myAPI(options); 

但是你会看到另一种模式是:

var myAPI = (function() { 

    function privateFunction1() { 
     ... 
    } 

    function privateFunction2() { 
     ... 
    } 

    function privateFunction3() { 
     ... 
    } 

    return { 
     init: function(options) { 
      //do something with options 
     }, 
     publicFunction1: privateFunction1, 
     publicFunction2: function() { 
      //some extra code 
      privateFunction2(); 
     }, 
     publicFunction3: function() { 
      ... 
     } 
    }; 
})(); 

在这种情况下,您将执行myAPI.init(options)来初始化API,但在此模式中myAPI实际上是一个单例(除非要保持每个实例的状态,否则通常是你想要的)。

+0

通过singleton你的意思是这个对象只有一个实例吗?而在第一个例子中,我们可以实例化几个对象? – smilebomb

+0

@jefffabiny是的。在第一个示例中,您可以有多个实例,但在第二个示例中,您实际上有一个单例。 –

1

它返回的方法,使得对象可以使用它们

3

它返回一个对象字面值。对象中的每个键都是一个函数。

这通常用于创建函数的命名空间,通过将它们放置在函数作用域中,函数将共享从命名空间继承的本地作用域。

例如,

var Namespace = (function() { 
    var helperFunction = function() { ... } 
    var localData = // ... 

    return { 
     publicFunction1 : function() { ... }, 
     publicFunction2 : function() { ... }, 
     publicFunction3 : function() { ... } 
    } 

})(); 
+0

因此,如果我在对象上调用setup(),它是否引用对象文字或上面定义的setup()函数? – smilebomb

+0

准确地说,它返回一个对象。 *对象文字*仅仅是一个创建对象的语法结构。 –

+0

如果有两个setup()函数,一个在'return {...}'语句中,另一个在'var setup = function(){...}'中定义,那么* *函数是一个本地函数,并不在Swipe API中公开。所以你会在'return {...}'语句中调用'setup'函数。 – ktm5124