在javascript中使用全局函数是否有效?

时间:2017-05-16 19:12:04

标签: javascript html html5 global-variables

我对全局脚本有疑问,我现在正在使用以下脚本,因为这些函数在每个页面上全局使用。 (在我拥有与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>

2 个答案:

答案 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)

是的,这似乎很好。如果您在整个页面上使用它,您也可以在全局范围内定义它。我推荐的唯一原因是,如果你有很多功能,或者你的代码与其他人编写的代码混合在一起。如果它很短并且没有其他人贡献,这种方式就更容易了。