JS编程建议——3:减少全局变量污染

建议3:减少全局变量污染
定义全局变量有3种方式:
在任何函数外面直接执行var语句。

  1. var f = 'value';
    直接添加一个属性到全局对象上。全局对象是所有全局变量的容器。在Web浏览器中,全局对象名为window。
  2. window.f = 'value';
    直接使用未经声明的变量,以这种方式定义的全局变量被称为隐式的全局变量。
  3. f = 'value';
    为方便初学者在使用前无须声明变量而有意设计了隐式的全局变量,然而不幸的是忘记声明变量成了一个非常普遍的现象。JavaScript的策略是让那些被忘记预先声明的变量成为全局变量,这导致在程序中查找Bug变得非常困难。

JavaScript语言最为糟糕的就是它对全局变量的依赖性。全局变量就是在所有作用域中都可见的变量。全局变量在很小的程序中可能会带来方便,但随着程序越来越大,它很快变得难以处理。因为一个全局变量可以被程序的任何部分在任意时间改变,使得程序的行为被极大地复杂化。在程序中使用全局变量降低了程序的可靠性。
全局变量使在同一个程序中运行独立的子程序变得更难。如果某些全局变量的名称与子程序中的变量名称相同,那么它们将会相互冲突并可能导致程序无法运行,而且通常还使程序难以调试。
实际上,这些全局变量削弱了程序的灵活性,应该避免使用全局变量。努力减少使用全局变量的方法:在应用程序中创建唯一一个全局变量,并定义该变量为当前应用的容器。

  1. var My = {};
  2. My.name = {
  3. "first-name" : " first ",
  4. "last-name" : " last "
  5. };
  6. My.work = {
  7. number : 123,
  8. one : {
  9. name : " one ",
  10. time : "2012-9-14 12:55",
  11. city : "beijing"
  12. },
  13. two : {
  14. name : "two",
  15. time : "2012-9-12 12:42",
  16. city : "shanghai"
  17. }
  18. };
    只要把多个全局变量都追加在一个名称空间下,将显著降低与其他应用程序产生冲突的概率,应用程序也会变得更容易阅读,因为My.work指向的是顶层结构。当然也可以使用闭包体将信息隐藏,它是另一种有效减少“全局污染”的方法。

在编程语言中,作用域控制着变量与参数的可见性及生命周期。这为程序开发提供了一个重要的帮助,因为它减少了名称冲突,并且提供了自动内存管理。

  1. var foo = function() {
  2. var a = 1, b = 2;
  3. var bar = function() {
  4. var b = 3, c = 4; // a=1, b =3, c=4
  5. a += b + c; // a=8, b =3, c=4
  6. }; // a=1, b =2, c=undefined
  7. bar(); // a=21, b =2, c=undefined
  8. };
    大多数采用C语言语法的语言都拥有块级作用域。对于一个代码块,即包括在一对大括号中的语句,其中定义的所有变量在代码块的外部是不可见的。定义在代码块中的变量在代码块执行结束后会被释放掉。但是,对于JavaScript语言来说,虽然该语言支持代码块的语法形式,但是它并不支持块级作用域。

JavaScript支持函数作用域,定义在函数中的参数和变量在函数外部是不可见的,并且在一个函数中的任何位置定义的变量在该函数中的任何地方都可见。
其他主流编程语言都推荐尽可能迟地声明变量,但是在JavaScript中就不能够这样,因为它缺少块级作用域,最好的做法是在函数体的顶部声明函数中可能用到的所有变量。

时间: 2024-08-28 08:45:13

JS编程建议——3:减少全局变量污染的相关文章

JS编程建议——20:不要使用new

建议20:不要使用new通过new运算符将创建一个继承于其运算数的原型的新对象,然后调用该运算数,把新创建的对象绑定给this.这给了运算数(它应该是一个构造器函数)一个机会,在返回给请求者前去自定义新创建的对象.如果忘记使用new运算符,得到的就是一个普通的函数调用,并且this被绑定到全局对象,而不是新创建的对象.这意味着当函数尝试去初始化新成员时,它将会"污染"全局变量,这是一件非常糟糕的事情,既没有编译时警告,也没有运行时警告.按照惯例,结合new运算符使用的函数应该被命名为首

JS编程建议——59:推荐动态调用函数

建议59:推荐动态调用函数调用函数更便捷的方式是使用Function对象的call和apply方法.apply与call方法在本质上没有太大区别,只不过它们传递给函数的参数方式不同, apply是以数组形式进行参数传递,而call方法可以同时传递多个值.如果某个函数仅能够接收多个参数列表,而现在希望把一个数组的所有元素作为参数进行传递,那么使用apply方法就显得非常便利.function max(){ var m = Number.NEGATIVE_INFINITY; // 声明一个负无穷大的

JS编程建议——65:比较函数的惰性求值与非惰性求值

建议65:比较函数的惰性求值与非惰性求值在JavaScript中,使用函数式风格编程时,应该对于表达式有着深刻的理解,并能够主动使用表达式的连续运算来组织代码.1)在运算元中,除了JavaScript默认的数据类型外,函数也作为一个重要的运算元参与运算.2)在运算符中,除了JavaScript的大量预定义运算符外,函数还作为一个重要的运算符进行计算和组织代码.函数作为运算符参与运算,具有非惰性求值特性.非惰性求值行为自然会对整个程序产生一定的负面影响.先看下面这个示例:var a = 2;fun

JS编程建议——6:正确处理JavaScript特殊值(2)

建议6:正确处理JavaScript特殊值(2)与null不同,undefined不是JavaScript的保留字,在ECMAScript v3标准中才定义undefined为全局变量,初始值为undefined.因此,在使用undefined值时就存在一个兼容问题(早期浏览器可能不支持undefined).除了直接赋值和使用typeof运算符外,其他任何运算符对undefined的操作都会引发异常.不过,可以声明undefined变量,然后查看它的值,如果它的值为undefined,则说明浏览

JS编程建议——8:谨慎使用运算符(1)

建议8:谨慎使用运算符(1)1.用===,而不用==JavaScript有两组相等运算符:===和!==.==和!=.===和!==这一组运算符会按照期望的方式工作.如果两个运算数类型一致且拥有相同的值,那么===返回true,而!==返回false.==和!=只有在两个运算数类型一致时才会做出正确的判断,如果两个运算数是不同的类型,会试图强制转换运算数的类型.转换的规则复杂且难以记忆,具体规则如下: '' == '0' // false 0 == '' // true 0 == '0' //

JS编程建议——21:推荐提高循环性能的策略(2)

建议21:推荐提高循环性能的策略(2)在每个循环中,每次运行循环体都要发生如下操作:第1步,在控制条件中读一次属性(items.length).第2步,在控制条件中执行一次比较(i < items.length).第3步,比较操作,观察条件控制体的运算结果是不是true(i < items.length == true).第4步,一次自加操作(i++).第5步,一次数组查找(items[i]).第6步,一次函数调用(process(items[i])).在这些简单的循环中,即使没有太多的代码,

JS编程建议——21:推荐提高循环性能的策略(1)

建议21:推荐提高循环性能的策略(1)每次运行循环体时都会产生性能开销,增加总的运行时间,即使是循环体中最快的代码,累计迭代上千次,也将带来不小的负担.因此,减少循环的迭代次数可获得显著的性能提升.例如: var iterations = Math.floor(items.length / 8), startAt = items.length % 8, i = 0; do { switch(startAt) { case 0: process(items[i++]); case 7: proce

JS编程建议——24:优化if逻辑(1)

建议24:优化if逻辑(1)逻辑顺序体现了人的思维的条理性和严密性.合理的顺序可以提升解决问题的品质,相反,混乱的顺序很容易导致各种错误的发生.在分支结构中经常需要面临各种优化逻辑顺序的问题.人在思考问题时,一般总会对各种最可能发生的情况做好准备,这叫做"有备而来".分支结构中各种条件根据情况的先后.轻重来排定顺序.如果把最可能的条件放在前面,把最不可能的条件放在后面,这样程序在执行时总会按照代码先后顺序逐一检测所有条件,直到发现匹配的条件时才停止继续检测.如果把最可能的条件放在前面,

JS编程建议——29:准确使用循环体(1)

建议29:准确使用循环体(1)1.选择正确的循环体在大多数编程语言中,代码执行时间多数消耗在循环的执行上.在一系列编程模式中,循环是最常用的模式之一,因此也是提高性能必须关注的地方之一.理解JavaScript 中循环对性能的影响至关重要,因为死循环或长时间运行的循环会严重影响用户体验.JavaScript定义了4种类型的循环:第一种循环是标准的for循环,与C语言使用同样的语法: for (var i=0; i < 10; i++){ //循环体 } for循环是最常用的循环结构,它由4部分组