几天前,我已经从自己的例子中了解到全局变量和函数有多糟糕。显然最好的解决方案是不要使用它们,但是迟早我需要一遍又一遍地重用我的变量和函数。
所以我的问题是:我可以重用我的函数和变量而不在全局声明它们吗?可以吗?
例如,我想多次重复使用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!!");
});
});
答案 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
处理程序)将永远不会是全局的,除非您犯下两个错误之一:
var
关键字,制作隐式全局window.myVar = ...;