2013-04-08 23 views
1

我正在学习一个JavaScript文件,并在其中看到一些方法被包装在一个jQuery函数中。任何人都可以帮助我如何调用以下方法吗?我可能知道什么是优点,或者为什么这个方法被封装在一个函数中?以下是我的示例JavaScript代码。如何调用这个包装在jQuery函数中的JavaScript方法

JQuery的/ JavaScript的

$(document).ready(function() { 
    //How to invoke "testMethod" method? 
    $(function() { 
     function testMethod() { 
      alert("this is a test method"); 
     } 
    }); 
}); 
+4

为什么你会使用'$(文件).ready'内'$(文件).ready'? '$(function(){});'是'$(document)的简写版本。ready' – 2013-04-08 05:55:50

+0

你打算如何调用它? DOM事件?或从另一个功能? – Joseph 2013-04-08 05:57:12

+0

@Travis J感谢您的信息,现在它回答我的问题“为什么” – 2013-04-08 05:57:47

回答

3

正如你已经声明它,testMethod()是本地功能,仅在声明它的功能范围内使用。如果您希望在该范围之外对其进行调用,则需要对其进行不同的定义,以便在更广的范围内可用。这样做的

一种方法是使它成为一个全局函数:

$(document).ready(function() { 
    //How to invoke "testMethod" method? 
    $(function() { 
     window.testMethod = function() { 
      alert("this is a test method"); 
     } 
    }); 
}); 

testMethod(); // available globally now 

它也可以连接到一个全局命名空间,也可能在较高的范围内它也可以解决你的问题来定义。没有关于你的情况的具体信息,我们不能建议哪一个最好,但是你需要做的主要事情是改变函数的声明方式,以便在你想调用它的范围内可用。

P.S.为什么你有一个嵌套在另一个文档就绪函数?这不会提供额外的功能并增加不必要的复杂性此外,如果您希望在全局范围内使用文档就绪处理程序,则确实没有理由在其中定义testMethod()

+0

不要让它们成为全球。将它们分配给不同的范围,但不要使它们成为全局范围。 – 2013-04-08 05:59:38

+0

@IngoBürk - 这取决于OP正在尝试做什么。如果他们提供更多细节,我们可以提供其他选项,但是他们的代码显然只是用于解决问题的一个例子,所以我们不知道他们在做什么或试图解决什么问题。在一些情况下,全局函数也是有用的,就像我在我的答案中也提到的其他构造一样。 – jfriend00 2013-04-08 06:00:43

+0

(不downvoter)这是做到这一点的一种方式,但绝对不是一个理想的方式。你总是可以将它附加到另一个全局变量中......比如使用jQuery提供的可用功能'$ .fn'。至少可以利用现有的结构。 – 2013-04-08 06:01:19

0

您的通话需要在$(function之内。

这是关于范围,你需要打破$(function的testMethod。

您是否可以进一步解释您的需求,以便我们可以提供更好的帮助?

0

成为准备就绪事件:

$(document).ready(function() { 
    //How to invoke "testMethod" method? 
    var testMethod = function() { 
     alert("this is a test method"); 
    } 

    // V0.1 
    testMethod(); 

    // V0.2 
    $('#some_id').click(testMethod); 
}); 

在其他部分:

$(document).ready(function(){...}); 
//is the same as 
$(function(){...}} 

至于你的问题,在这里的都是这样做的潜在途径:

myObj = {testMethod: null}; 
$(document).ready(function() { 
    //How to invoke "testMethod" method? 
    myObj.testMethod = function() { 
     alert("this is a test method"); 
    } 
}); 

// Something else 
if(myObj.testMethod) myObj.testMethod(); 
1

别的之前:

  • 如果该功能是每个人都使用了一些实用功能,然后把它提供给所有的一些命名空间,就像在这个叫Utility

    //Utility module 
    (function(ns){ 
        //declaring someFunction in the Utility namespace 
        //it's available outside the ready handler, but lives in a namespace 
        ns.someFunction = function(){...} 
    }(this.Utility = this.Utility || {})); 
    
    $(function(){ 
        //here in the ready handler, we use it 
        Utility.someFunction(); 
    }); 
    
  • 如果他们都住在ready处理程序,并希望它将被处理程序中的所有代码使用,并在处理程序的最外层声明它,以便所有嵌套的作用域都可以看到它。

    $(function(){ 
        //declare it in the outermost in the ready handler 
        function someFunction(){...} 
    
        //so we can use it even in the deepest nesting 
        function nestedSomeFunction(){ 
        someFunction(); 
        } 
    
        someElement.on('click',function(){ 
        $.get('example.com',function(){ 
         someFunction(); 
        }); 
        }); 
    
        nestedSomeFunction(); 
        someFunction(); 
    
    }); 
    
相关问题