《javascript模式》 容易踩中的那些坑
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之间的差别
- eval()会影响到作用域
- new Function()中的代码将在局部函数空间中运行,因此代码中任何采用var定义的变量不会自动成为全局变量
- 无论在哪里执行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模式》 容易踩中的那些坑的更多相关文章
- 关于javascript模式一书中var white = new Array(256).join(“ ”)
直接进入正题 var white = new Array(256).join(" ") 运行后,我们会发现white.length的长度是255,这个是为什么呢?书上没有给出解答, ...
- 【Fine原创】JMeter分布式测试中踩过的那些坑
最近因为项目需要,研究了性能测试的相关内容,并且最终选用了jmeter这一轻量级开源工具.因为一直使用jmeter的GUI模式进行脚本设计,到测试执行阶段工具本身对资源的过量消耗给性能测试带来了瓶颈, ...
- Jmeter Web 性能测试入门 (七):Performance 测试中踩过 Jmeter 的坑
脚本运行的过程中,大量request抛error,但没有地方能够查看request是因为什么error的. 原因:Jmeter默认禁掉了运行过程中每个request的具体response信息收集,只保 ...
- 三分之一的程序猿之社交类app踩过的那些坑
三分之一的程序猿之社交类app踩过的那些坑 万众创新,全民创业.哪怕去年陌生人社交不管融资与否都倒闭了不知道多少家,但是依然有很多陌生人社交应用层出不穷的冒出来.各种脑洞大开,让人拍案叫起. 下面我们 ...
- Android Camera开发经验总结以及踩过的那些坑
写在开头 需求方:上传试卷的时候,用户自己拍的照片有很多问题.如:不清晰.图片歪了.错误图片等.我们要是能够对拍摄照片进行识别处理就好了,能够裁切矫正就更好了,最好可以像二维码扫描一样,直接识别处理- ...
- javascript 模式(1)——代码复用
程序的开发离不开代码的复用,通过代码复用可以减少开发和维护成本,在谈及代码复用的时候,会首先想到继承性,但继承并不是解决代码复用的唯一方式,还有其他的复用模式比如对象组合.本节将会讲解多种继承模式以实 ...
- 与webview打交道中踩过的那些坑
随着HTML5被越来越多的用到web APP的开发当中,webview这一个神器便日渐凸显出重要地位.简要的说,webview能够在移动应用中开辟出一个窗口,在里面显示html页面,css以及js代码 ...
- 安装python爬虫scrapy踩过的那些坑和编程外的思考
这些天应朋友的要求抓取某个论坛帖子的信息,网上搜索了一下开源的爬虫资料,看了许多对于开源爬虫的比较发现开源爬虫scrapy比较好用.但是以前一直用的java和php,对python不熟悉,于是花一天时 ...
- 【读书笔记】读《JavaScript模式》 - 函数复用模式之现代继承模式
现代继承模式可表述为:其他任何不需要以类的方式考虑得模式. 现代继承方式#1 —— 原型继承之无类继承模式 function object(o) { function F() {}; F.protot ...
随机推荐
- js中关于动态添加事件,不能使用循环变量的问题
在编写事件的时候,我们难免会遇到以下这种情况:<!DOCTYPE html><html lang="en"><head> <meta ch ...
- SQL Server 2008 删除数据库帐号失败问题
SQL Server 2008 中单独为一个项目建立了一个账号zdhsa,结果发现无法删除. 问题:删除zdhsa失败. 解决:首先从"安全性"-"架构"中删除 ...
- 21个高质量的Swift开源iOS App
原文:21 Amazing Open Source iOS Apps Written in Swift 对Swift初学者来说,学习开源项目,阅读源码是个不错的方法.在这篇文章中,基于对代码质量和排名 ...
- 安装配置NFS服务
超级好的配置centos下服务的链接 http://www.server-world.info/en/note?os=CentOS_6&p=nfs http://linux.vbird.org ...
- 奇怪吸引子---Rucklidge
奇怪吸引子是混沌学的重要组成理论,用于演化过程的终极状态,具有如下特征:终极性.稳定性.吸引性.吸引子是一个数学概念,描写运动的收敛类型.它是指这样的一个集合,当时间趋于无穷大时,在任何一个有界集上出 ...
- [转]Java Spring的Ioc控制反转Java反射原理
转自:http://www.kokojia.com/article/12598.html 学习一个东西的时候,如果想弄明白,最好想想框架内部是如何实现的,如果是我做我会怎么实现.下面我就写一个Ioc ...
- JAX-RS(基于Jersey) + Spring 4.x + MyBatis构建REST服务架构
0. 大背景 众所周知,REST架构已经成为现代服务端的趋势. 很多公司,已经采用REST作为App, H5以及其它客户端的服务端架构. 1. 什么是JAX-RS? JAX-RS是JAVA EE6 引 ...
- javamail邮件发送例子
public class EmailTask{ // Session used by the javamail classes private Session session; ...
- VS2010在运行状态下编辑代码
在VS2010环境下,当程序处于调试运行状态时,编辑代码会出现下图提示框: 这就给边编辑代码边查看程序运行效果带来不便. 解决方法:在程序没有运行的时候,打开菜单“工具”——>“选项”——> ...
- 【卡西欧Fx-5800p】市场分析 ppt
一.ppt视频 二.大概内容 1:2010年的4万亿救市政策和 2011年4月后财政收缩政策 2:2011-7-23温州动车追尾事故70%的公路高铁等基础建设项目停缓建 ·····