2015-02-06 79 views
0

我知道我可以定义文档准备好处理程序超出了我的函数,然后调用它像这样:在文档准备好之外使用函数的首选方法?

function sayHello(){ 
    alert('hello'); 
} 
    $(document).ready(function(){ 
    sayHello();  
    }); 

但我不知道是否有做这样的说法一下行

我也知道,我可以定义使用的命名空间我的功能,像这样:

sayHi = { 
    sayHello: function() { 
     alert('hello'); 
    } 
} 
$(document).ready(function(){ 

sayHi.sayHello();  

}); 

所以是我的第二个例子更好那么第一个或也许有这样做的更好的解决方案?在这方面

+0

你究竟在努力实现什么?为什么你需要*函数在'document.ready'之外?在第一种情况下,缺点是它是全局的,可以被其他代码访问或覆盖。 – 2015-02-06 16:18:49

回答

2

几个建议:

  1. 定义在最小的范围内尽可能的功能。因此,如果sayHi()仅用于document.ready()之内,则将其定义在document.ready()之内。

  2. 尽可能少地创建新的全局变量。如果您必须在全局范围内定义多个东西,那么创建一个全局名称空间对象并将其他全局事物作为属性通常是一个好主意。

  3. 使用IIFE封闭来包装需要分享的代码。您可以通过将代码封装在IIFE(立即调用的函数表达式)中而不创建任何全局变量来在大块代码之间共享函数。这本质上为您的大部分代码(甚至是您的所有代码)创建了一个新的函数范围,然后您可以在该范围内定义常用函数。大多数jQuery库都在这些闭包中。这也可以保护您的代码片段不受欢迎的外部访问。

  4. 总是使用var(或者ES6中的let)来显式声明您的变量。这样你就不会创建偶然的全局或隐式全局变量。

  5. 在严格模式运行。以严格模式运行时,忘记使用varlet将触发一个错误,您将立即看到该错误,因为隐式或偶然全局错误是严格模式下的错误。

在你的具体的例子,如果你还需要调用sayHi()document.ready()之外,那么您可以使用IIFE,以避免产生任何新的全局变量:


(function() { 
    function sayHi() { 
     alert('hello'); 
    } 


    $(document).ready(function() { 
     sayHi(); 
    }); 

    // other code 
    // ... 

    sayHi(); 

})(); 

如果您不需要从document.ready()以外拨打sayHi(),那么只需在document.ready()之内定义它:

$(document).ready(function() { 
    function sayHi() { 
     alert('hello'); 
    } 

    sayHi(); 
}); 
+0

@dejodekic - 我添加了几个代码示例。 – jfriend00 2015-02-06 16:37:27

+0

非常感谢你! – 2015-02-06 16:38:28