【问题标题】:is it valid to use global function in javascript?在javascript中使用全局函数是否有效?
【发布时间】:2017-05-16 19:12:04
【问题描述】:

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

【问题讨论】:

  • 嗯,是的。这是完全有效的最佳实践。 ????
  • 最好将它包装到一个对象中,这样你就不会与其他函数名进行拦截,但如果所有代码都是由你编写的,那就没有必要了......
  • @PraveenKumar 谢谢,因为我从不同的人那里听到了不同的选择,现在我感觉好多了;D

标签: javascript html global-variables


【解决方案1】:

是的,它是有效的。

如果您不想污染全局范围(并避免名称冲突),最佳做法是将您的函数包装在一个对象中并将该对象公开给全局范围

这是一个示例,但其想法是根据函数的行为将函数捆绑在一起

<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>

【讨论】:

  • 谢谢,当我调用这些函数时,我使用global.stuff.setCookie()?
  • 我已经编辑了我的答案。只需使用 window :) 我在函数内部使用 global 来更通用。
  • 这看起来更好,捆绑函数真的很有意义,并且定义全局函数的方式看起来更好。感谢您的帮助!
  • 很高兴它有帮助 ;)
【解决方案2】:

是的,看起来不错。如果您在整个页面中都使用它,您不妨在全局范围内定义它。我不推荐的唯一原因是,如果您有很多功能,或者您的代码与其他人编写的代码混合在一起。如果它很短并且没有其他人参与,那么这种方式会更容易。

【讨论】:

    猜你喜欢
    • 2023-01-17
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 2016-11-16
    • 1970-01-01
    • 2015-06-13
    相关资源
    最近更新 更多