我对全局脚本有疑问,我现在正在使用以下脚本,因为这些函数在每个页面上全局使用。 (在我拥有与8个地方定义的unit converter
函数相同的函数之前,现在我将它移动到全局脚本,所以我只定义一次。)
我的问题是,这是一种有效的方法还是最佳做法?我真的需要它们在全局定义并在其他脚本调用这些方法之前加载。
我搜索过,这样的文章建议不要使用全局函数。 https://www.w3schools.com/js/js_best_practices.asp
避免全局变量
尽量减少全局变量的使用。
这包括所有数据类型,对象和功能。
其他脚本可以覆盖全局变量和函数。
改为使用局部变量,并学习如何使用闭包。
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
/*-----------------------------------------------------
global function for Set/Get Cookie
------------------------------------------------------*/
function setCookie(cname,cvalue,exdays) {
var d = new Date();
d.setTime(d.getTime() + (exdays*24*60*60*1000));
var expires = "expires=" + d.toGMTString();
document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
}
function getCookie(name) {
var value = "; " + document.cookie;
var parts = value.split("; " + name + "=");
if (parts.length == 2) return parts.pop().split(";").shift();
}
/*-----------------------------------------------------
global function for ...
------------------------------------------------------*/
function getLBS_Global(p, q, u, b, wb) {
if (b === null || wb === null) {
alert("Error in unit conversion, please retry");
}
var out = {};
switch (u) {
case "8": // A bushel
out.q = (q * b);
out.p = (p / b);
break;
case "10": // lbs
out.q = q;
out.p = p;
break;
case "11": // cwt
out.q = (q * 100);
out.p = (p / 100);
break;
case "12": // metric tonne
out.q = (q * 2204.62262);
out.p = (p / 2204.62262);
break;
case "136": // W bushel
out.q = (q * wb);
out.p = (p / wb);
break;
}
return out;
}
</script>
</head>
<body>
...
</body>
答案 0 :(得分:3)
是的,它有效。
如果您不想污染全局范围(并避免名称冲突),最佳做法是将您的函数包装在对象中并将对象公开到全局范围
这是一个例子,但我们的想法是根据行为将函数捆绑在一起
<script type="text/javascript">
(function(global){
function setCookie(cname,cvalue,exdays) {
var d = new Date();
d.setTime(d.getTime() + (exdays*24*60*60*1000));
var expires = "expires=" + d.toGMTString();
document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
}
function getCookie(name) {
var value = "; " + document.cookie;
var parts = value.split("; " + name + "=");
if (parts.length == 2) return parts.pop().split(";").shift();
}
global.bundleObj = {
setCookie: setCookie,
getCookie: getCookie
}
})(window)
</script>
然后代码中的任何地方
<script>
window.bundleObj.setItem()
</script>
答案 1 :(得分:2)