全局变量污染 闭包 命名空间

原则

  1. 用匿名函数将脚本包起来;
  2. 使用多级命名空间。

这第二条“使用多级命名空间”这个,我觉得并不是很完美的好主意。因为如果级数太多的话会造成变量名字变得长的一逼。

改进过程

原始代码

没有做过任何优化的满目疮痍的代码。a.js 和 b.js 都有全局变量 window.a ,导致冲突,全局变量属于 window 作用域下的。

//a.js
<script type="text/javascript">
    //都什么时代了,script标签还写type属性呢?黄牌警告!下次绝逼不写了。
    var a = 123, b = "hello world";
</script>

//b.js
<script>
    //看!这把没有写了吧~就是这么任性,上面的那个写了的也绝逼不改!
    var a, c = "abc";
</script>

使用匿名函数

通过匿名函数改变了a.js 和 b.js 中的变量 a 的作用域,使得他们都不再是全局变量了,但是在 b.js 中无法访问在 a.js 中的变量 a, 换而言之,他们之间没办法通信了。

//a.js
(function() {
    var a = 123, b = "hello world";
})();

//b.js
(function() {
    var a, c = "abc";
})();

使用全局变量进行通信

var str;
//a.js
(function() {
    var a = 123,
    b = "hello world";
    window.str = a;
})();

//b.js
(function() {
    var a, c = "abc";
    alert(window.str);
})();

使用 window.str 这种全局全局变量作为通信的媒介其实并不是一个好办法,这样做会导致全局变量越来越多,反而不好维护。

使用命名空间

var GLOBAL = {};
//a.js
(function() {
    var a = 123,
    b = "hello world";
    GLOBAL.A.a = a;
})();

//b.js
(function() {
    var a, c = "abc";
    alert(GLOBAL.A.a);
})();

使用单一的全局变量 GlOBAL ,匿名空间里需要保存的属性都在全局变量 GLOBAL 的基础上使用命名空间的方式进行拓展。这里给命名空间起名字也需要很讲究,好的命名规则会对团队协同合作有很大的帮助。具体的命名方式待我卖个关子,以后再说。未完待续

时间: 2024-11-06 13:48:59

全局变量污染 闭包 命名空间的相关文章

Javascript匿名函数的作用之一:创建临时的命名空间,防止全局变量污染

如果你写了一段js模块的代码,这段代码将用在不同的程序中(对客户端Javascript来说通常是在各种各样的网页中).假定这段代码定义了一个用以存储中间计算结果的变量,问题来了,这个变量可能会同其他代码中的全局变量发生冲突.解决的办法是将模块代码放入一个函数内部,然后立即调用这个函数.这样全局变量就变成了函数内部的局部变量: function() myModule(){ //模块代码,这个模块所用的所有变量都是局部变量,而不会污染全局命名空间 } myModule(); //立即调用这个函数 这

防止js全局变量污染方法总结

javaScript 可以随意定义保存所有应用资源的全局变量.但全局变量可以削弱程序灵活性,增大了模块之间的耦合性.在多人协作时,如果定义过多的全局变量 有可能造成全局变量冲突,也就是全局变量污染问题,以下是两种解决办法 一.定义全局变量命名空间 只创建一个全局变量,并定义该变量为当前应用容器,把其他全局变量追加在该命名空间下 var MY={}; my.name={ big_name:"zhangsan", small_name:"lisi" }; my.work

[转] 防止js全局变量污染方法总结

javaScript 可以随意定义保存所有应用资源的全局变量.但全局变量可以削弱程序灵活性,增大了模块之间的耦合性.在多人协作时,如果定义过多的全局变量 有可能造成全局变量冲突,也就是全局变量污染问题,以下是两种解决办法 一.定义全局变量命名空间只创建一个全局变量,并定义该变量为当前应用容器,把其他全局变量追加在该命名空间下 var MY={};my.name={big_name:"zhangsan",small_name:"lisi"};my.work={scho

js全局变量污染问题

javaScript 可以随意定义保存所有应用资源的全局变量.但全局变量可以削弱程序灵活性,增大了模块之间的耦合性.在多人协作时,如果定义过多的全局变量 有可能造成全局变量冲突,也就是全局变量污染问题,以下是两种解决办法 一.定义全局变量命名空间 只创建一个全局变量,并定义该变量为当前应用容器,把其他全局变量追加在该命名空间下 var MY={}; my.name={ big_name:"zhangsan", small_name:"lisi" }; my.work

25.函数例题-预解析 作用域 、函数变量优先级、全局变量污染(直接在全局声明 、 函数里的变量没声明)但是函数里的变量没声明造成的全局变量污染有个前提,函数要被调用)

1.  return foo()   foo 没有return值,故为undefined.   2.      a b 在函数作用域内,外界找不到   var a = b =3; b 也算用var 声明了,只不过b 是在全局隐式var 了一个b ,在函数内部找不到变量的情况下就去全局找,全局找不到报错.    语法有错误,程序一句都不会执行,执行阶段有错误,会执行没错的代码,在执行出错的地方报错.  函数或则匿名函数体内声明变量是为了避免全局变量污染 重要例题:  函数没执行,全局没找到 b报错

解决全局变量污染问题

什么是污染-------->全局变量就是污染.常用的解决污染的几种方式a.函数b.对象c.命名空间d.立即函数 函数和对象就是我们把变量放到函数或者对象里,成为局部变量,通过访问函数内的变量来获取想要得到的内容,这个就不详细解释了. 这里引入一个命名空间的例子:这样进行访问会很大程度降低污染问题了. /*顶级 一级*/ var demo={};//根部 /*二级*/ demo.web={ sum:10, tab:function(){} }; demo.finance = { sum:20, t

变量作用域问题,全局变量污染

<script> function fun1(){ max = 5;//注意 此处max虽在函数内,但没var声明 } fun1(); //这里调用fun1()相当于在全局var了一个max变量 function fun2(){ max = 10;//此处更改了全局变量max,fun()1中的max也被更改,就是全局变量被污染.fun1()变量被污染的根源是因为他没保护好自己的变量max,如果函数内要声明被保护的变量必须加var,不可能在方法外改变方法内的变量,只能向上爬树 } fun2();

【JavaScript错题记录】变量定义提升、this指针指向、运算符优先级、原型、继承、全局变量污染、对象属性及原型属性优先级

原文位置http://caibaojian.com/toutiao/5446 1.所有变量声明(var)或者声明函数都会被提升到当前函数顶部 关于函数表达式,js会将代码拆分为两行代码分别执行.这里需要注意的是 var getName 和 function getName都是声明语句,区别在于var getName是函数表达式,function getName是函数声明,这里使用var进行函数声明和变量声明时一样的,都是声明提前至当前函数最顶部,二函数声明是将函数声明提升至当前函数顶部.(这个有

JavaScript笔记杂谈篇(啥都有)

二维码缩放比例以43PX的倍数缩放最为标准. NuGet相关管理http://www.cnblogs.com/dudu/archive/2011/07/15/nuget.html 学习笔记: http://kb.cnblogs.com/page/143190/ 动态创建标记,给标记添加样式,class,等等   vardtProductName=$("<dt></dt>",{style:"text-overflow: ellipsis;overflow