Javascript是一门容易遭人误解的语言,但是它的强大毋庸置疑。个人觉得,要想深入理解Javascript语言,首先必须对其基本的概念(例如:Scope,Closure,Hoisting等)要真正理解。今天想通过自己的理解来对Javascript Hoisting(国内一般翻译为 变量提升)做一个阐述:

  在解释Javascript Hoisting之前,先看一下几段代码:

     //代码段1--------------------------
var myvar = '变量值';
console.log(myvar); // 变量值
//代码段2--------------------------
var myvar = '变量值';
(function() {
console.log(myvar); //变量值
})();
//代码段3----------------------------
var myvar = '变量值';
(function() {
console.log(myvar); // undefined
var myvar = '内部变量值';
})();

  代码段1会在控制台打印出 变量值 ,很容易理解;代码段2也会在控制台打印出 变量值 ,Javascript编译器首先在匿名函数内部作用域(Scope)查看变量myvar是否声明,发现没有,就继续向上一级的作用域(Scope)查看是否声明 myvar,发现存在,即打印出该作用域的myvar值。但代码段3只是对代码段2做一个微调,结果却输出了undefine!!!

  在理解代码段3之前,必须先理解Javascript Hoisting的概念。Javascript Hoisting:In javascript, every variable declaration is hoisted to the top of its declaration context.我的理解就是在Javascript语言中,变量的声明(注意不包含变量初始化)会被提升(置顶)到声明所在的上下文,也就是说,在变量的作用域内,不管变量在何处声明,都会被提升到作用域的顶部,但是变量初始化的顺序不变。

下图的左边和右边的代码输出结构是一样的,左边的代码段在JS执行时,实际的执行顺序如右边的代码所示(JS编译器会将变量声明进行提升处理)。

  理解了提升的概念之后,再回到开头的代码段3的理解中来,代码段3和在被Hositing之后的代码如下图所示:

  二者输出的结构都为undefined!可理解为内部变量myvar在匿名函数的内最后一行进行变量声明并赋值,但是JS解释器会将变量声明(不包含赋值)提升(Hositing)到匿名函数的第一行(顶部),由于只是声明myvar变量,在执行console.log(myvar)语句时,并未对myvar进行赋值,所以JS输出undefined。

  如果变量声明未提升(Hositing)置顶,则应该会报错误。如下图所示:

  下面给个测试题,来看看你对Hositing的概念是否理解:

     //测试代码----------------------
var myvar = '变量值';
(function() {
console.log(myvar); // ?
myvar = '内部变量值';
})();

  该代码段应该输出什么值呢?

答案是 变量值。关于函数提升,请看另一篇博文http://www.cnblogs.com/isaboy/p/javascript_function.html

最新文章

  1. 学习web前端开发基础技术需要掌握:HTML、CSS、JavaScript语言
  2. composer 安装提示 PHP Warning: readfile(): SSL operation failed with code 1
  3. sphinx通过增量索引实现近实时更新
  4. setInterval和clearInterval
  5. Tunna内网转发
  6. iOS 访问粘贴板
  7. Nhiberate (二) 搭项目
  8. python 字符串分割
  9. RTSP协议学习笔记
  10. hadoop中遇到的问题。
  11. 监控concurrent 正在执行的sql
  12. Java虚拟机-运行时数据区域
  13. 推荐系统模型之 FM
  14. 光速搭lvs + keepalived + nginx
  15. Create JSON by Jackson API(转)
  16. JMeter学习(二十一)关联(转载)
  17. Python 工匠:编写条件分支代码的技巧
  18. python教程2:list和tuple
  19. MySql(十三):MySql架构设计——可扩展性设计之 MySQL Replication
  20. cat /etc/init.d/nfs 这句话看不懂

热门文章

  1. 利用split
  2. Android 框架学习之 第一天 okhttp & Retrofit
  3. 启动CLR
  4. C#:委托和自定义事件
  5. 机器学习实战笔记(Python实现)-01-K近邻算法(KNN)
  6. Postgresql 导出表结构信息
  7. ios合并静态库
  8. 【小白的CFD之旅】08 CFD速成之道
  9. Ural 1011. Conductors
  10. POJ2104 K-th Number[主席树]【学习笔记】