当前位置:首页 > 日记 > 正文

最通俗易懂的javascript变量提升详解

最通俗易懂的javascript变量提升详解

如下所示:

a = 'ghostwu';var a;console.log( a );

在我没有讲什么是变量提升,以及变量提升的规则之前, 或者你没有学习过变量提升,如果按照现有的javascript理解, 对于上述的例子,你可能会认为第3行代码的输出结果应该是undefined, 因为第二行是var a; 声明变量,但是没有赋值,所以a的值是undefined, 但是正确的结果是ghostwu. 至于为什么,请继续往下看!

console.log( a );var a = 'ghostwu';

对于上面这个例子,第一行代码,你可能认为报错, 因为在输出a之前,没有定义a变量, 但是正确的结果是undefined. 嗯,好像有点莫名奇妙,javascript太bug了.

要搞清楚为什么,首先我们要明确以下2点:

javascript代码并不是一行一行往下执行的.

javascript执行分为2个步骤:

编译(词法解释/预解释)

执行

其次,当我们碰到 var a = "ghostwu" 定义一个变量的时候, 其实js把这句话看成是2个阶段的事, var a 发生在编译阶段, a = 'ghostwu'发生在执行阶段. 然后 var a会被提升到当前作用域的最前面, a = 'ghostwu'留在原地等待执行阶段,所以:

a = 'ghostwu';var a;console.log( a );//上面这段代码经过编译之后,变成下面这样var a; //被提升到当前作用域的最前面a = 'ghostwu'; //留在原地,等待执行console.log( a );
console.log( a ); var a = 'ghostwu';//上面这段代码,经过编译之后,变成下面这样var a;console.log( a );a = 'ghostwu';

看完编译后的代码,你明白了吗?

在接着讲下面之前,我们先明确函数常见的2种定义方式:

//函数声明, 形如:  function show(){   console.log( '函数声明方式' );  }  //函数表达式, 形如:  var show = function(){   console.log( '表达式方式' );  }

因为表达式和函数声明,在编译阶段,会产生不同的解释效果。

show();  function show(){   console.log( a );   var a = 'ghostwu';  }

对于上面这段代码,会在编译阶段,如何解释呢?记住下面这句话就行了:

函数声明会被提升

所以,上面的代码,经过编译之后,就变成了下面这样:

function show(){ //函数声明被提升到 当前作用域的最前面   var a; //var声明被提升到当前作用域的最前面, 注意,他不会提升到函数的外面, 因为当前的作用域是在函数中   console.log( a );   a = 'ghostwu';  }  show();

所以,上面的结果就是undefined;

对于函数表达式,是不会提升的, 看下面的例子:

show(); //报错,show is not a functionvar show = function(){ console.log( 'ghostwu' );}//对于上面这段表达式代码,经过编译之后:var show;show(); //执行之后就是 undefined(), 所以在表达式定义之前,调用函数报错了show = function(){ console.log( 'ghostwu' ); }
show(); //你好  var show;  function show(){   console.log( '你好' );  }  show = function(){   console.log( 'hello' );  }

上面这段代码,结果为什么会是 '你好'?

因为: 当出现同名的函数声明,变量声明的时候, 函数声明会被优先提升,变量声明会被忽略。 所以经过编译之后,就变成:

function show(){   console.log( '你好' );  }  show(); //你好  show = function(){   console.log( 'hello' );  }  show();//如果这里在调用一次,就是hello, 因为show函数体在执行阶段 被 重新赋值了

如果有同名的函数声明,后面的会覆盖前面的,如下:

show(); //how are you  var show;  function show(){   console.log( 'hello' );  }   show = function(){   console.log( '你好' );  }  function show(){   console.log( 'how are you!' );  }//上面的代码经过编译之后,变成如下形式:  function show(){   console.log( 'how are you!' );  }  show(); //how are you  show = function(){   console.log( '你好' );  }  show(); //如果在这里再执行一次,结果:你好
//思考题: 请问下面的结果是什么? 为什么? 写下你的答案   show();   var a = true;   if( a ){    function show(){     console.log( 1 );    }   }else {    function show(){     console.log( 2 );   }   }

以上这篇最通俗易懂的javascript变量提升详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

相关文章

Dreamweaver如何向网页添加音乐

Dreamweaver如何向网页添加音乐

音乐,网页,电脑软件,Dreamweaver,当我们在做网页时,我们会添加你喜欢的音乐,并为你带来今天添加音乐的方式。 软件名称:Adobe Dreamweaver CC 20143264位中文破解安装版(附破解教程)软件大小:320mb更新时间:2014-06-25 1。首先,打开DW软件并构建…

用PHP解决约瑟夫环算法实例

用PHP解决约瑟夫环算法实例

算法,约瑟夫,实例,电脑软件,PHP,本文介绍了用PHP堆栈解决约瑟夫环问题的算法,供大家参考: 约瑟夫环问题:39个犹太人,约瑟夫斯和他的朋友们藏在山洞里,和39个犹太人决定死而不是被敌人抓住。我决定自杀,41人排成一圈,从第一个人开始数,报告数量的每…

Node.js使用orm2进行update操作时

Node.js使用orm2进行update操作时

修改,字段,操作,解决方法,电脑软件,前言最近在工作中遇到一个问题,在使用Orm2进行model修改时,发现当对关联字段进行update操作时,执行了2次SQL,第一次把值改为了我们期望的值,第二次又会把值改回成原来的值。经过调查,当autoFetch开启时,会自动取…

WPS文字中怎么制作联合发文文件头

WPS文字中怎么制作联合发文文件头

文件,文字,方法,发文,电脑软件,  WPS文字中怎么制作联合发文文件头?在WPS文字中,表格工具的作用不仅仅是用来制作表格的。活用表格,有时会收到意想不到的效果,完成一些特殊的任务。下面小编就教你WPS文字中制作联合发文文件头的方法。WPS文…

word页面设置为横向页面的方法

word页面设置为横向页面的方法

方法,横向,页面,设置为,电脑软件,word怎么设置为横向页面呢?在编辑word文档时,有时我们需要的横向长度不够长,这时候就需要把word的横向页面改为纵向页面,以下就是小编给大家分享的word页面设置为横向页面的方法。方法步骤如下:1.文件--页面设…

PHP使用PDO访问oracle数据库的步骤

PHP使用PDO访问oracle数据库的步骤

步骤,数据库,详解,电脑软件,PHP,前言PDO 从一开始就吸取了现有数据库扩展成功和失败的经验教训。因为 PDO 的代码是全新的,所以我们有机会重新开始设计性能,以利用 PHP 5 的最新特性。PDO 旨在将常见的数据库功能作为基础提供,同时提供对于 RD…

PHP基于回溯算法解决n皇后问题的方

PHP基于回溯算法解决n皇后问题的方

方法,回溯算法,示例,皇后,电脑软件,本文实例讲述了PHP基于回溯算法解决n皇后问题的方法。分享给大家供大家参考,具体如下:这里对于n皇后问题就不做太多的介绍,相关的介绍与算法分析可参考前面一篇C++基于回溯法解决八皇后问题。回溯法的基本做…

WPS演示2013如何对进行淡化处理

WPS演示2013如何对进行淡化处理

演示,图片,电脑软件,WPS,  有时候插入图片之后,觉得颜色太鲜艳了,想要淡化色彩,其实并不难。以下是小编为您带来的关于WPS演示2013对图片进行淡化处理,希望对您有所帮助。WPS演示2013对图片进行淡化处理①启动WPS演示,插入图片之后,在图片上插…

ps怎么设计一个网络感十足的社交行

ps怎么设计一个网络感十足的社交行

网络,行业,社交,电脑软件,ps,ps中想要给网页设计一个科技感的banner,该怎么设计呢?下面我们就来看看详细的教程。软件名称:Adobe Photoshop 8.0 中文完整绿色破解版软件大小:150.1MB更新时间:2015-11-041、新建文件,创建画布2、添加一个科技感的…

如何配置IIS运行 ASPX

如何配置IIS运行 ASPX

运行,配置,电脑软件,IIS,ASPX,如何配置IIS运行 ASPX最近在做 .ASPX 搞了好一阵子,才弄懂这个东西,和大家分享…… 欢迎讨论一、先注册asp.net组件: (asp.NET 组件即:.Net Framework )开始->运行->cmd->执行命令:C:\windows\Microsof…

web 开发之创建本地文件夹的实现方

web 开发之创建本地文件夹的实现方

方法,电脑软件,web,web 开发之创建本地文件夹的实现方法 filemanage_util.fullPath 就是创建文件的路径这是跨平台的创建文件夹,不像Android那样还要通过 Environment.getExternalStorageDirectory() 的原生代码来创建实现代码:document.addE…

php两个多维数组组合遍历的实例

php两个多维数组组合遍历的实例

遍历,多维数组,组合,实例,两个,实例如下:$res = $this->LoanRecord->searchloan($conditions,$columns,$page,$this->num,$user_id); foreach ($res[1] as $key => $value) { if(!empty($value['b']['id'])){ $result_day = $this->L…