2011-10-11 52 views
2

,我有以下的代码我的网页上:外部JavaScript文件应该如何避免全局变量和方法?

<script src="/Assets/JavaScripts/myJavaScript.js" type="text/javascript"></script> 

<script type="text/javascript"> 

    testAlert(); 

</script> 

而在myJavaScript.js我有以下几点:

(function() { 
    function testAlert() { 
      alert('test alert'); 
    } 
})(); 

这不叫testAlert。不知道我在这里做错了什么?我试图避免全局变量和方法。我在jQuery中做了一些类似的工作,它在外部文件的开头只需要$。有人可以请解释我在这里做错了什么,以及如何确保我遵循最佳做法?

回答

2

我把你的代码放在我的环境中,并检查,我在mozila错误控制台中出错。 所以,请检查它。 你只能在myjavascript.js文件中放置下面的javascript函数。

function testAlert() { 
    alert('test alert'); 
} 
+0

给我评论,如果它可以帮助你... – sikender

+0

谢谢,但是什么是(function(){})();部分? –

+0

@Brendan:基本上,它创建一个函数并立即运行它。在你的情况下,对于jQuery插件(通常写成'(function($){......})(jQuery)';',它(1)非常确定jQuery可用作为'$'(即使它处于无冲突模式,这使'$'不再意味着'jQuery'),并且(2)创建了一个空间,您可以在其中关闭私有全局内容。 – cHao

1

你在js文件中的函数没有返回任何东西。为了避免全局变量,你可以创建一个全局命名空间(类似的)变量:

var myNS = (function() { 
    function testAlert() { 
      alert('test alert'); 
    } 
    return {testAlert:testAlert}; 
}()); 

现在你可以在你的内联JavaScript中使用myNS.testalert()

0

JS是以这样一种方式制作的,你真的不能完全避免全局性。 (好吧,你可以,有点儿,如果你从不给​​出任何名字,但是这往往会导致更多的问题,而不是解决的问题。)当你从其他脚本中调用testAlert时,假设testAlert是全局的。如果不是这样,你不能只从这样的地方打电话。

您可以通过添加你的东西到一个对象,作为一个命名空间,像这样最大限度地减少碰撞的机会,不过,:

// don't clear it out if it already exists. 
// that way all of your scripts can use your namespace, if you want. 
// what you're really trying to protect against, are strangers picking names 
// like yours. 
if (!window.myNamespace) myNamespace = {}; 

// example function 
myNamespace.testAlert = function() { alert("test alert"); }; 


myNamespace.testAlert(); 

这样,有相互冲突的一个很好的机会,唯一的名称是myNamespace

我打算展示名称空间全局的例子...但你知道什么吗?名称空间全局是,仍然是全局的。全局变量是你想在大多数情况下尝试并摆脱的东西。

0

您需要一些类型的全局变量,以便您可以访问您正在查找的方法。事实上,您有<script>testAlert()</script>意味着您期望在全局名称空间中定义testAlert()

我喜欢做什么(特别是在使用YUI时,你已经标记了这个问题),就是创建一个充当实用类的全局对象。

var page = { 
    init: function() { 
     // Do some initialization... 
    }, 
    testAlert: function() { 
     alert("Test Alert"); 
    } 
}; 

当你这样做后,你可以使用单一的全局“页面”变量来访问你需要的一切。

// e.g. 
page.testAlert(); 

// or... 
Y.on("domready", page.init, page); 

再次,对于第二个例子,我假设你使用YUI,因为你用它标记了这个问题。