全局变量声明深入了解javascript系列学习笔记(一):编写高质量JavaScript代码的基本要点


上班之余抽点时间出来写写博文,希望对新接触的朋友有帮助。今天在这里和大家一起学习一下全局变量声明

    代码维护成本比较高,所以要编写可维护的代码。下面分点介绍如何编写可维护的代码。

    

全局变量和局部变量

    javascript通过函数来管理作用域。

    在每个函数的表面可以通过this来访问全局对象。在浏览器中这个全局对象是window,即在全局作用域访问时:this === window

    全局变量轻易出现定名冲突,所以要尽量少应用全局变量。在声明变量的时候一定要应用var来声明,未经声明被应用的变量会成为全局变量,这类情况下生成的全局变量为隐式全局变量

 隐式全局变量和明白定义的全局变量间有些小的差异,就是通过delete操作符让变量未定义的能力。

    

  • 通过var创立的全局变量(任何函数以外的程序中创立)是不能被删除的。
  • 无var创立的隐式全局变量(无视是不是在函数中创立)是能被删除的。

1 var a = 1;
2 b = 0;
3 //删除
4 delete a;
5 delete b;
6 //删除结果测试
7 console.log(typeof a);//number
8 console.log(typeof b);//undefined
在应用连等的方式来赋值的时候要格外注意: 下面的函数中a是局部变量,b是全局变量
1 function test(){
2     var a = b  = {name:"syh"};
3 }
4 test();
5 console.log( typeof a);//udefinded
6 console.log(typeof b);//object 
应用连等的方式来赋值的时候要应用下面的方式:先声明变量,再赋值
1 function test(){
2     var a,b;
3     a = b  = {name:"syh"};
4     ...
5 }
 当要声明多个变量的时候,尽量要应用一个var来声明:
var a = 0;
var b = 1;
var c = 2;

//应用一个var来声明
var a = 0,
    b = 1,
    c = 2;
//推荐应用
var a = 0
   ,b = 1
   ,c = 2;     
javascript可以在函数的恣意位置声明变量,但是这与在顶部声明变量在起同样的作用:从下面的例子可以看出,所声明的变量都被悬置到函数的顶部
1 var param = "test";
2 (function(){
3     console.log(param);//undefined
4     var param = "test1";
5     console.log(param);//test1
6 }())

for循环 和 for-in循环

    for循环一般用来作数组循环

// 次佳的循环
for (var i = 0; i < myarray.length; i++) {
  //...
}

//推荐方式
for (var i = 0,arrLength = myarray.length; i < arrLength ; i++) {
   // ...
}
    每日一道理
这浓浓的母爱使我深深地认识到:即使你是一只矫健的雄鹰,也永远飞不出母爱的长空;即使你是一条扬帆行驶的快船,也永远驶不出母爱的长河!在人生的路上不管我们已走过多远,还要走多远,我们都要经过母亲精心营造的那座桥!
  for-in 循环应当用在非数组对象的遍历上,应用 for-in 进行循环也被称为“枚举”。虽然for-in循环也可用来遍历数组,但是不推荐这样做。

    对象有一个hasOwnProperty()方法,可以用来过滤定义在原型上的属性和方法

// 对象
var man = {
   hands: 2,
   legs: 2,
   heads: 1
};

// 在代码的某个地方
// 一个方法添加给了全部对象
if (typeof Object.prototype.clone === "undefined") {
   Object.prototype.clone = function () {};
}
// 1.
// for-in 循环
for (var i in man) {
   if (man.hasOwnProperty(i)) { // 过滤
      console.log(i, ":", man[i]);
   }
}
/* 控制台显示结果
hands : 2
legs : 2
heads : 1
*/
// 2.
// 反面例子:
// for-in loop without checking hasOwnProperty()
for (var i in man) {
   console.log(i, ":", man[i]);
}
/*
控制台显示结果
hands : 2
legs : 2
heads : 1
clone: function()
*/
另外一种应用 hasOwnProperty() 的情势是过滤Object.prototype上的方法。像是:

 (当初还没有理解)

1 for (var i in person) {
2    if (Object.prototype.hasOwnProperty.call(person, i)) { // 过滤
3       console.log(i, ":", person[i]);
4    }
5 }
6 //输出结果
7 /*name : syh
8    age : 10*/
其利益在于在person对象重新定义hasOwnProperty情况下避免定名冲突。也避免了长属性查找对象的全部方法,你可以应用局部变量“缓存”它。
var i, hasOwn = Object.prototype.hasOwnProperty;
for (i in person) {
    if (hasOwn.call(person, i)) { // 过滤
        console.log(i, ":", person[i]);
    }
}

其他

    避免应用eval();记着该咒语“eval()是魔鬼”。此方法接受恣意的字符串,并当作JavaScript代码来处理。

// 反面示例
setTimeout("myFunc()", 1000);
setTimeout("myFunc(1, 2, 3)", 1000);

// 更好的
setTimeout(myFunc, 1000);
setTimeout(function () {
   myFunc(1, 2, 3);
}, 1000);
 

    parseInt()你可以从字符串中获得数值,该方法接受另一个基数参数,这经常省略,但不应当。要加上第二个参数:转化的进制

    不要扩展内置原型

    要应用 === 和 !== 不要应用 == 和 !=

文章结束给大家分享下程序员的一些笑话语录: 刹车失灵
有一个物理学家,工程师和一个程序员驾驶着一辆汽车行驶在阿尔卑斯山脉 上,在下山的时候,忽然,汽车的刹车失灵了,汽车无法控制地向下冲去, 眼看前面就是一个悬崖峭壁,但是很幸运的是在这个悬崖的前面有一些小树 让他们的汽车停了下来, 而没有掉下山去。 三个惊魂未定地从车里爬了出来。
物理学家说, “我觉得我们应该建立一个模型来模拟在下山过程中刹车片在高 温情况下失灵的情形”。
工程师说, “我在车的后备厢来有个扳手, 要不我们把车拆开看看到底是什么 原因”。
程序员说,“为什么我们不找个相同的车再来一次以重现这个问题呢?”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值