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. Mybatis-Spring集成

    MyBatis-Spring用来将MyBatis无缝整合到Spring中.使用这个类库中的类, Spring将会加载必要的MyBatis工厂类和Session类. 这个类库也提供一个简单的方式来注入 ...

  2. phpstrom正则替换

  3. [ Arch Linux ] Arch更新源高速源整理之测速并自动排序高速源 加快更新效率

    方法一: 工具:rankmirrors 0x01 备份原来的源,并创建一个测试源 cd /etc/pacman.d cp mirrorlist mirrorlist.bakcp mirrorlist ...

  4. dsp28377控制DM9000收发数据——第二版程序,能够实现手术功能,但是容易掉帧;使用读取中断寄存器的方式判断中断

    G:\controlSUITE\device_support\F2837xD\v180\F2837xD_examples_Cpu1\emif1_16bit_asram\cpu01\emif1_16bi ...

  5. ueditor .net版本上传图片功能配置

    1.官网下载 UEditor .Net最新版:官方网址:http://ueditor.baidu.com/website/download.html#ueditor   UTF-8版 和GBK版选择疑 ...

  6. SPOJ 375 Query on a tree 树链剖分模板

    第一次写树剖~ #include<iostream> #include<cstring> #include<cstdio> #define L(u) u<&l ...

  7. eclipse设置项目编码

    首先Windows->Preferences, 然后选择General下面的Workspace. Text file encoding选择Other GBK, 如果没有GBK的选项, 没关系, ...

  8. php总结 --- 18. 七牛云存储

    第三方资源拉取 /** * 七牛云抓取文件 * @param string $url 文件URL地址 * * 参考地址:http://developer.qiniu.com/code/v6/api/k ...

  9. javascript高级编程3第三章:基本概念 本章内容 语法 数据类型 流控制语句 函数

    3.1 语法 ECMAScript的语法大量借鉴了C及其他类C语言的语法. 3.1.1 区分大小写 3.1.2 标识符 所谓标识符,就是值变量.函数.属性的名字,或者函数的参数.标识符可以是按照下列格 ...

  10. 深入理解js构造函数

    JavaScript对象的创建方式 在JavaScript中,创建对象的方式包括两种:对象字面量和使用new表达式.对象字面量是一种灵活方便的书写方式,例如: ? 1 2 3 4 5 6 var o1 ...