2016-11-16 136 views
1

所以,我在我的頁面中包含一個JavaScript文件。下面是它的要點:Javascript嵌套函數「不是函數」

var PageTransitions = (function() { 

    function setCurrent(currentSet) { 
     alert(currentSet); 
    } 

    function nextPage(options, direction, gotopage) { 
     //some working code, not important 
    } 

})(); 

在頁面上,我使用的是:

PageTransitions.nextPage(x, x, x); 

這工作正常。然而,欲以

PageTransitions.setCurrent(x); 

給我PageTransitions.setCurrent不是一個函數

不知道爲什麼發生這種情況,可以肯定的語法是正確的。不幸的是,這是爲了工作,不允許分享它發生的實際頁面。如果我們的高級開發人員看一看,但他們說它看起來應該起作用。有關爲什麼會發生這種情況的任何想法?

我調用javascript文件被調用後調用setCurrent,也試圖在nextpage後移動它以確保。 nextPage仍然有效,setCurrent仍然不是一個函數。

也嘗試重命名setCurrent和它傳遞的變量。仍然沒有好處。

+2

還有其他設置變量的值。在您所展示的代碼中,IIFE以外的任何功能都不可用。 – JJJ

+0

你似乎將一個簡單的IIFE與你需要一個對象的模塊模式相混淆 – Bergi

回答

4

如果你打算鏈,你需要的屬性,另一個函數內部定義的不只是功能,最簡單的是一個對象字面

var PageTransitions = { 
    setCurrent : function(currentSet) { 
     alert(currentSet); 
     return this; 
    }, 
    nextPage : function(options, direction, gotopage) { 
     //some working code, not important 
     return this; 
    } 
} 

PageTransitions.nextPage(x, x, x); 

,或者如果IIFE都有一個目的,返回一個對象文字

var PageTransitions = (function() { 
    function setCurrent(currentSet) { ... } 
    function nextPage(options, direction, gotopage) { ... } 

    return {setCurrent, nextPage}; 
})(); 
+0

釘住了它。謝謝。 –

0

(function() { 
 

 
    function setCurrent(currentSet) { 
 
     alert(currentSet); 
 
    } 
 

 
    function nextPage(options, direction, gotopage) { 
 
     //some working code, not important 
 
    } 
 

 
    var o = {}; // Dummy object 
 

 
    // set properties to local functions 
 
    o.setCurrent = setCurrent; 
 
    o.nextPage = nextPage; 
 

 
    // Attach dummy to global namespace to make it available 
 
    window.PageTransitions= o; 
 

 
})(); 
 

 
// Now, you can access your functions via your namespace: 
 
PageTransitions.setCurrent("test"); 
 
PageTransitions.nextPage();

+1

爲什麼在'var PageTransitions'工作正常時使用'window.PageTransitions'反模式? – Bergi

+0

@Bergi我沒有說'var PageTransitions'不起作用。我認爲我的答案更爲明確。另外,那種'var'方法很容易出現,而我的解決方案則不然。 –

+0

@Bergi另外,好奇你爲什麼在'var approach'導致相同的結果時將我的方法稱爲反模式。不過,這兩種方法都可以適應全球。 –

2

如果PageTransitions.nextPage(x, x, x);正在工作,這不是由於您發送的代碼。

您需要返回功能,這樣PageTransitions訪問它:

var PageTransitions = (function() { 

    function setCurrent(currentSet) { 
     alert(currentSet); 
    } 

    function nextPage(options, direction, gotopage) { 
     //some working code, not important 
    } 

    return { 
     setCurrent: setCurrent, 
     nextPage: nextPage 
    }; 
})(); 

現在PageTransitions.setCurrent定義。