1 链式赋值的陷阱

   1:  function func(){
2: var innerVar = globalVar = 20;
3: }
4: func();
5: console.log(typeof globalVar); //输出结果为?

上面最后的输出结果是?相信不少人会毫不犹豫地说undefined,确定?

真相是:number

原因:从右至左操作符的优先级。首先,优先级较高的是表达式b=0,此时b未经声明。表达式的返回值为0,它被赋给var声明的局部变量a,如以下代码所示

var a = (b = 0);

建议:对链式赋值的所以变量都进行声明,再进行赋值

   1:  function foo() {
   2:      var a, b;
   3:      a = b = 20;    //都是局部变量
   4:  }

2 变量释放时的副作用

隐含全局变量与明确定义的全局变量有细微的不同,不同之处在于能否使用delete操作符撤销变量

  • 使用var创建的全局变量(这类变量在函数外部创建),不能删除
  • 不使用var创建的隐含全局变量(尽管它是在函数内部创建),可以删除

这表明隐含全局变量严格来讲不是真正的变量,而是全局对象的属性。属性可以通过delete操作符删除,但变量不可以

//定义三个全局变量
var global_var = 1;
global_novar = 2; //反模式
(function(){
global_fromfunc = 3; //反模式
})(); //企图删除
delete global_var; //false
delete global_novar; //true
delete global_fromfunc; //true //测试删除情况
typeof global_var; //'number'
typeof global_novar; //'undefined'
typeof global_fromfunc; //'undefined'

在ES5 strict模式中,为没有声明的变量赋值会抛出错误

3 for-in的陷阱

   1:  function func(){
2: var innerVar = globalVar = 20;
3: }
4: func();
5: console.log(typeof globalVar); //输出结果为?
将上述代码稍微修改下又如何呢?
   1:  var person = {
   2:      name: 'casper',
   3:      age: 11
   4:  };
   5:  Object.prototype.getName = function(){};  
   6:  for(var key in person){
   7:      console.log(key);
   8:  }

输出结果变成:

输出:name输出:age输出:getName

建议:不要增加内置对象的原型,除非必要,同时需在团队内进行良好的沟通,确保其他团队成员不会因此而遇到一些奇怪的错误

4 注意eval与new Function之间的差别

  1. eval()会影响到作用域
  2. new Function()中的代码将在局部函数空间中运行,因此代码中任何采用var定义的变量不会自动成为全局变量
  3. 无论在哪里执行Function,它都仅能看到全局作用域
   1:  console.log(typeof un);  //'undefined'
   2:  console.log(typeof deux);  //'undefined'
   3:  console.log(typeof trois);  //'undefined'
   4:   
   5:  var jsstring = "var un  = 1; console.log(un);";
   6:  eval(jsstring);  //logs "1"
   7:   
   8:  jsstring = "var deux = 2; console.log(deux);";
   9:  new Function(jstring)();  //logs "2"
  10:   
  11:  jsstring = "var trois = 3; console.log(trois);";
  12:  (function(){
  13:      eval(jsstring);
  14:  })();  //logs  "3"
  15:   
  16:  console.log(un);  //'number'
  17:  console.log(typeof deux);  //'number'
  18:  console.log(typeof trois);  //'undefined'

从上面代码示例可以很清楚地看出前两点,关于第三点,请看下面代码示例:

   1:  (function(){
   2:      var local = 1;
   3:      eval("local = 2; console.log(local);");  //logs 3
   4:      console.log(local);  //logs 3
   5:  })();
   6:   
   7:  (function(){
   8:      var local = 1;
   9:      new Function("console.log(typeof local);")();  //logs 'undefined'
  10:  })();

《javascript模式》 容易踩中的那些坑的更多相关文章

  1. 关于javascript模式一书中var white = new Array(256).join(“ ”)

    直接进入正题 var white = new Array(256).join(" ") 运行后,我们会发现white.length的长度是255,这个是为什么呢?书上没有给出解答, ...

  2. 【Fine原创】JMeter分布式测试中踩过的那些坑

    最近因为项目需要,研究了性能测试的相关内容,并且最终选用了jmeter这一轻量级开源工具.因为一直使用jmeter的GUI模式进行脚本设计,到测试执行阶段工具本身对资源的过量消耗给性能测试带来了瓶颈, ...

  3. Jmeter Web 性能测试入门 (七):Performance 测试中踩过 Jmeter 的坑

    脚本运行的过程中,大量request抛error,但没有地方能够查看request是因为什么error的. 原因:Jmeter默认禁掉了运行过程中每个request的具体response信息收集,只保 ...

  4. 三分之一的程序猿之社交类app踩过的那些坑

    三分之一的程序猿之社交类app踩过的那些坑 万众创新,全民创业.哪怕去年陌生人社交不管融资与否都倒闭了不知道多少家,但是依然有很多陌生人社交应用层出不穷的冒出来.各种脑洞大开,让人拍案叫起. 下面我们 ...

  5. Android Camera开发经验总结以及踩过的那些坑

    写在开头 需求方:上传试卷的时候,用户自己拍的照片有很多问题.如:不清晰.图片歪了.错误图片等.我们要是能够对拍摄照片进行识别处理就好了,能够裁切矫正就更好了,最好可以像二维码扫描一样,直接识别处理- ...

  6. javascript 模式(1)——代码复用

    程序的开发离不开代码的复用,通过代码复用可以减少开发和维护成本,在谈及代码复用的时候,会首先想到继承性,但继承并不是解决代码复用的唯一方式,还有其他的复用模式比如对象组合.本节将会讲解多种继承模式以实 ...

  7. 与webview打交道中踩过的那些坑

    随着HTML5被越来越多的用到web APP的开发当中,webview这一个神器便日渐凸显出重要地位.简要的说,webview能够在移动应用中开辟出一个窗口,在里面显示html页面,css以及js代码 ...

  8. 安装python爬虫scrapy踩过的那些坑和编程外的思考

    这些天应朋友的要求抓取某个论坛帖子的信息,网上搜索了一下开源的爬虫资料,看了许多对于开源爬虫的比较发现开源爬虫scrapy比较好用.但是以前一直用的java和php,对python不熟悉,于是花一天时 ...

  9. 【读书笔记】读《JavaScript模式》 - 函数复用模式之现代继承模式

    现代继承模式可表述为:其他任何不需要以类的方式考虑得模式. 现代继承方式#1 —— 原型继承之无类继承模式 function object(o) { function F() {}; F.protot ...

随机推荐

  1. Windows 8.1/Server 2012 R2/Embedded 8.1 with Update 3(MSDN最新版)

    微软于12月16日更新了包含Update 3的ISO,此次更新并不会明显改善用户的界面体验,下载后请校验MD5.我整理了中.英文的8.1/服务器版/嵌入式版本/多国语言包. 1,Windows 8.1 ...

  2. WPA-PSK无线网络破解原理及过程(转)

    本文将主要讲讲WPA-PSK类型的无线网络安全问题,首先我们看下802.11协议相关的基础知识. 802.11常见的几种认证方式: 1.不启用安全‍‍ ‍‍2.WEP‍‍ ‍‍3.WPA/WPA2-P ...

  3. Advacned Puppet: Puppet Master性能调优

    本文是Advanced Puppet系列的第一篇:Puppet master性能调优,谈一谈如何优化和提高C/S架构下master端的性能. 故事情节往往惊人地类似:你是一名使用Puppet管理线上业 ...

  4. Android自定义相机拍照、图片裁剪的实现

    最近项目里面又要加一个拍照搜题的功能,也就是用户对着不会做的题目拍一张照片,将照片的文字使用ocr识别出来,再调用题库搜索接口搜索出来展示给用户,类似于小猿搜题.学霸君等app. 其实Android提 ...

  5. ElasticSearch + Kibana

    关键词: 数据可视化 数据分析 数据爬虫 信息检索(搜索引擎) ElasticSearch是基于Lucene的分布式搜索引擎,提供多种插件及配套工具. 其中Kibana可以“关联”ES中的数据集,进行 ...

  6. 关于Domino数据库的软删除

    在Domino的数据库属性的 “高级” 附签(选择文件->数据库->属性),选中“允许软删除”,这样我们就启用了软删除功能,当一个文档没有删除的时候我们可以使用NotesDatabase的 ...

  7. Drupal7_2:安装drupal

    Drupal7_2:安装drupal 分类: Drupal72012-10-30 01:06 1074人阅读 评论(0) 收藏 举报 假设你已经搭建好了所需的必备环境,接下来就参照以下几步,快速安装一 ...

  8. 持续集成工具Hudson安装实例

    安装maven 下载maven,解压 [root@localhost local]# pwd /usr/local [root@localhost local]# -bin.tar.gz [root@ ...

  9. oracle密码错误验证延迟

    补充从10g升级到11g之后需要注意的几个密码方面问题: 1. 11g默认开始密码区分大小写,可以通过把参数设置为SEC_CASE_SENSITIVE_LOGON =FALSE 屏蔽 2. 11g密码 ...

  10. Asp.net Core WebApi 全局异常类

    通过全局异常类,所有程序中遇到的错误都会被拦截,并友好的返回结果. 1.自定义一个全局异常处理类中间件 using Microsoft.AspNetCore.Http; using Newtonsof ...