没有全局变量的重用函数?

时间:2012-07-31 14:07:40

标签: javascript jquery

几天前,我已经从自己的例子中了解到全局变量和函数有多糟糕。显然最好的解决方案是不要使用它们,但是迟早我需要一遍又一遍地重用我的变量和函数。

所以我的问题是:我可以重用我的函数和变量而不在全局声明它们吗?可以吗?

例如,我想多次重复使用alertBox函数和containsP变量:

DEMO:http://jsfiddle.net/ajmyZ/

//I am BAD GLOBAL FUNCTION inside var 
//But I am reusable!!! 

var alertBox = function () {
    alert("Hey I am BAD function!!")
}





$(document).ready(function () {
    //I am BAD GLOBAL var 
    //But I am reusable TOO!!! 
    var containsP = $("div p:first");
    containsP.click(function () {
        alert("Hi BAD var HERE!!");
    });

    $("p").eq(1).click(function () {
        alertBox();
    });

    //I am the NICEST function here
    //but I am NOT reusable :(

    $("p").eq(2).click(function () {
        alert("I am the NICEST function here!!");

    });

});

2 个答案:

答案 0 :(得分:4)

我想避免破坏全局对象的最简单方法就是创建自己的“应用程序上下文”。你可以通过创建一个自动调用函数来实现这一点,该函数将整个js-code包装在每个文件中。

(function( win ) {
    "use strict";

    var still_global_but_only_in_this_anonymous_closure = true;

    $(document).ready(function() {
         // ...
         // accessing the global object:
         win.some_global_property = true;
    });
}( this ));

实际上,您已经使用传递给.ready()的匿名函数创建了这样的本地上下文。这只是更明确的方式。这种自调用方法,只需将全局对象作为参数调用(您仍然可以显式访问全局变量)。此外,通过调用"use strict";,您可以免受意外创建全局变量的影响"Ops_I_Forgot_The_Var_Statment = true;

答案 1 :(得分:1)

您发布的代码没有全局变量。在函数内部声明的变量(在您的示例的情况下,匿名document.ready处理程序)将永远不会是全局的,除非您犯下两个错误之一:

  1. 忘记var关键字,制作隐式全局
  2. 明确说出window.myVar = ...;