我正在创建一些自定义对象和函数,我想对全局命名空间隐藏这些对象和函数(包括限制其可访问性)。
如果我放在document.ready函数中,它会与放在闭包中具有相同的效果吗?还是我需要在document.read声明中对jquery引用进行别名,以确保我的自定义代码不在全局命名空间之外?
选项1。普通文档就绪
$(document).ready(function()
//do custom stuff
选项2:在准备好文件的内关闭
$(document).ready(function(){
(function($) {
//do custom stuff
})(jQuery);
选项3:在文档就绪中别名jquery引用
jquery(document).ready(function($) {
//do custom stuff
首选方案是什么?感谢
您必须理解ECMAscript中的每个函数实际上都是一个闭包。因此,在您的特定代码段中,您在哪个函数(context)中创建这些变量(除了其他上下文的可访问性之外),这并没有什么区别。
如果在任何函数中声明变量,它们将仅在该函数中可见。
此外,为了确保您的作用域中有正确的$
,我会选择选项3(但将函数名从jquery
更正为jQuery
)。选项1和2已经假设$
是正确的别名,但即使外部作用域中的$
与jQuery
不同(例如,如果调用了jQuery.noConflict()
,或者加载了另一个库,如Prototype.js等),选项3也会起作用,但使$
在您的//do custom stuff
所在的内部作用域中始终表示jQuery
。
在JavaScript中,每个函数都有自己的作用域,在函数内部声明的任何对象或变量都只能由函数本身或在函数内部宣布的其他函数看到。
创建命名空间最常见的方法是创建一个函数,该函数在定义后自动调用,并返回一个包含数据的对象,就像第二个选项中一样。然后可以通过该对象访问所有数据。在任何情况下,如果你只想从代码的其他部分隐藏变量,只需创建一个函数并声明你想隐藏在其中的所有内容