1 javascript作用域

初学javascript的时候,变量的作用域就感觉有些麻烦,他不像C#或java那样清晰明了,貌似处处都在作用域内,但有时会处处都是空。

javascript中,变量的作用域只有两种,全局变量和局部变量,并且只由函数决定,函数内的即为局部变量,函数外的就为全局变量 如图:

一切要是都这样,那么世界该有多么美好!!!但是 总会有各种各样的陷阱

陷阱1:函数中声明全局变量

  1. 函数中省略var 关键字
  2. 笔误 在for循环中,i前忘记写var
  3. 第二点的扩充,for(var i...)的情况下,i的作用域不为for循环内部,而是整个函数

    所以,比较好的写法应为

陷阱2 变量提升

javascript中,变量定义后,在执行环境中会提升至环境顶部,并赋予初始值undefined

具体表现为:变量无论在何处定义,均会充斥整个函数,但在赋值语句前的值为undefined。

注意此时,输出信息并不是变量未发现,而是变量的值为undefined。

举一个更明显的例子:

可以看到在,在变量赋值之前,无论定义位置,均会有默认初始值undefined

陷阱3:前两个陷阱合成的一个大陷阱!

和想象的是不是不太一样,原因就是,在执行环境中,首先v被提升至函数头,赋值undefined

var v="设置值";
function demo5()
{
var v=undefined;
console.log(v);
}
demo5();

  

是不是和想象的还不一样?这个更复杂些,因为执行函数之前,一定能确定函数参数的数据类型和数据值,所以,首先就会给函数参数初始化并赋值,然后声明局部变量(变量提升,陷阱2),但并不初始化,此时值为undefined,并初始化函数。

这一系列的操作会产生一个新的执行环境。执行环境下一篇文章再说。

参考资料:犀牛书,《单页web应用》,其他大牛blog 谢谢

javascript温故知新的更多相关文章

  1. 温故知新 javascript 正则表达式

    很长时间没看 正则表达式了,碰巧今天用到,温故知新了一把 看书学习吧 50% 的举一反三练习中的原创.   一 javascript正则表达式的基本知识 1     javascript 正则对象创建 ...

  2. javaScript高级教程(八)-----正则表达式温故知新

    1.RegExp对象:五个属性二个方法 五个属性:global, ignoreCase,multiline,lastIndex,source 二个方法: exec()--模式匹配 test()--检测 ...

  3. javascript中的一些核心知识点以及需要注意的地方

    前言 近期杂事甚多,这些事情的积累对知识体系的提升有好处,但是却不能整理出来,也整理不出来 比如说我最近研究的Hybrid在线联调方案便过于依赖于业务,就算分享也不会有人读懂,若是抽一点来分享又意义不 ...

  4. javascript --- 只继承于原型

    正如上次所述,,出于效率考虑,我们应该尽可能的将一些可重用的属性和方法添加到原型中去. 如果养成了这个好习惯,我们仅仅依靠原型就能顺利的完成继承关系的构建了. 毕竟采用new her()方法将her的 ...

  5. 再回首,Java温故知新(一):Java概述

    Java发展历程 Java的发展要追溯到1991年,Patrick Naughton(帕特里克·诺顿)和James Gosling(詹姆斯·高斯林)带领Sun公司的工程师打算为有线电视转换盒之类的消费 ...

  6. JavaScript八张思维导图

    JS基本概念 JS操作符 JS基本语句 JS数组用法 Date用法 JS字符串用法 JS编程风格 JS编程实践 不知不觉做前端已经五年多了,无论是从最初的jQuery还是现在火热的Angular,Vu ...

  7. JavaScript八张思维导图—基本概念

    JS基本概念 JS操作符 JS基本语句 JS数组用法 Date用法 JS字符串用法 JS编程风格 JS编程实践 不知不觉做前端已经五年多了,无论是从最初的jQuery还是现在火热的Angular,Vu ...

  8. JavaScript八张思维导图—操作符

    JS基本概念 JS操作符 JS基本语句 JS数组用法 Date用法 JS字符串用法 JS编程风格 JS编程实践 不知不觉做前端已经五年多了,无论是从最初的jQuery还是现在火热的Angular,Vu ...

  9. JavaScript八张思维导图—基本语句

    JS基本概念 JS操作符 JS基本语句 JS数组用法 Date用法 JS字符串用法 JS编程风格 JS编程实践 不知不觉做前端已经五年多了,无论是从最初的jQuery还是现在火热的Angular,Vu ...

随机推荐

  1. 表单 阻止 技巧 JavaScript js

    阻止表单的提交,可以用return false 来进行阻止 长度不低于6,不高于20 if(username.length < 6 || username>20){ alert (&quo ...

  2. JAVA 多线程学习总结

    新手一枚,Java学习中,把自己学习多线程的知识总结一下,梳理下知识,方便日后查阅,高手莫进. 本文的主要内容: [1]    实现线程的两种方法                [2]  线程的启动与 ...

  3. 2016年12月30日 星期五 --出埃及记 Exodus 21:25

    2016年12月30日 星期五 --出埃及记 Exodus 21:25 burn for burn, wound for wound, bruise for bruise.以烙还烙,以伤还伤,以打还打 ...

  4. python 给定n,返回n以内的斐波那契数列

    方式一:函数 def fabs(n): a, b = 0, 1 while b < n: print(b, end=' ') a, b = b, a+b fabs(1000) 方式二:列表 re ...

  5. Generate Time Data(普通日期主数据)

    Note: While using this option you need to replicate the standard table into SAP HANA that is T005T, ...

  6. Xcode7 *** does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE)

    *** does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE ...

  7. 剑指offer五:

    输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. /* public class ListNode { int val; ListNode next = n ...

  8. maven多模块下使用JUnit进行单元测试

    1.选中需要进行测试的service类,右键->new->other->JUnit Test Case,如下图: 2.编写测试代码如下: AppServiceTest.java im ...

  9. Java时间的处理

    1. Java计算时间依靠1970年1月1日开始的毫秒数.2. Date类的构造函数Date()返回代表当前创建的时刻的对象.Date的方法getTime()返回一个long值在数值上等于1970年1 ...

  10. POI 解析xls

    1.所需jar包 poi-3.6.jar poi-ooxml-3.6.jar 2.M.java package junit; import java.io.FileInputStream; impor ...