2016-11-16 126 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定义。