专栏首页smh的技术文章javascript中的变量提升的简单说明
原创

javascript中的变量提升的简单说明

我们首先看一段代码:

console.log(smh);
var smh = "全局";
function fn() {
    console.log(smh);
    var smh = "函数";
}
fn();

大家认为会输出什么呢?还是会直接报错呢?我们来看看结果吧。

1.undefined 2.undefined

两个输出都是undefined。为什么呢?这就要从js中变量的提升和函数作用域来说起了。

首先我们定义了两个变量。都名为smh,其中一个位于全局作用域中,另一个位于函数作用域中。

大家会认为第一个输出会报错,因为变量的声明在输出在后,第二个输出会打印出“全局”,因为第二个变量声明也是声明于打印之后,这就要从js中的变量的提升说起了。

在js引擎在解释代码之前会进行编译,编译的时候,就会找到所有的变量声明,把所有的变量的声明(不赋值)提升到各自作用域的顶端。

比如上述的代码就会变成如下形式:

var smh;
console.log(smh);
smh = "全局";
function fn() {
    var smh;
    console.log(smh);
    smh = "函数";
}
fn();

看到这里,大家应该就明白了为什么两个输出都是undefined了把。

我主要说说函数里面的输出为什么也是undefined,这就跟作用域链有关了。

上述代码一共有两个执行环境,以下是“Javascript高级程序设计”中对于作用域的解释

当代码在一个环境中执行时,会创建变量对象的一个作用域链( scope chain)。作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端,始终都是当前执行的代码所在环境的变量对象。如果这个环境是函数,则将其活动对象( activation object)作为变量对象。活动对象在最开始时只包含一个变量,即 arguments对象(这个对象在全局环境中是不存在的)。作用域链中的下一个变量对象来自包含(外部)环境,而再下一个变量对象则来自下一个包含环境。这样,一直延续到全局执行环境;全局执行环境的变量对象始终都是作用域链中的最后一个对象。标识符解析是沿着作用域链一级一级地搜索标识符的过程。搜索过程始终从作用域链的前端开始,然后逐级地向后回溯,直至找到标识符为止(如果找不到标识符,通常会导致错误发生)

因为函数有自己的执行环境,js的变量提升,把变量提升了这个函数的最顶端。所以自然也是输出undefined了,

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • var和let声明变量时的一些区别

    1.如果在全局作用域中用var声明变量,此变量会默认成为window的一个属性,let声明的变量则不会添加到window对象中。

    小明爱学习
  • css使用for属性美化radio控件

    我们在使用radio,checkbox等控件的时候,需要对原有的样式进行美化,但是此类控件美化程度有限。

    小明爱学习
  • canvas绘制图形时beginPath应用

    当我们在使用canvas绘制图形的时候,不免都会使用到beginPath这个方法。今天我们就来讲解一下这个函数的重要性以及应用。

    小明爱学习
  • CS系列-使用powershell的免杀

    将生成的ps代码集成到一个图片中,图片尽量像素大一点,我们需要用到invoke-psimage脚本,原理是将脚本中的字节数据存储到图片中,而图片的每一个像素都会...

    字节脉搏实验室
  • 编程小白 | 每日一练(160)

    这道理放在编程上也一并受用。在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从编程小白进阶到高手,需要经历的是日积月累的学习,那么如何学习呢?当然是每天都...

    C语言入门到精通
  • 原 Spring Cloud 完整微服务搭

    kinbug [进阶者]
  • Django/Flask/Tornado三大web框架性能分析

    本文的数据涉及到之前遇到过的问题,大概一次 http 请求到收到响应需要多少时间。这个问题在实际工作中与框架有比较大的关系,因此特别就框架的性能做了一次分析。

    IT派
  • 【程序中的数学】利用德摩根定律简化布尔运算

    今天说说德摩根定律在编程中的实践,题目看的很吓人,其实只要有一点点的高中数学知识就能看懂,而且这部分知识掌握后可以很快的运用到项目中,投资收益比非常高。

    卤代烃
  • javaFX(二)-使用gradle+jdk14创建javafx程序

    在上一篇文章中,我们一起学习了jlink和jdk14的模块化. 在本篇文章中,我们一起来学习gradle来新建一个javafx的Hello World 程序.

    微笑的小小刀
  • Java如何调用dll

    -----------------------------前置条件-------------------------------------

    烂猪皮

扫码关注云+社区

领取腾讯云代金券