ES6 之后,JavaScript 的变量声明经历了翻天覆地的变化。直到 ECMAScript 5.1,var 都是声明变量

的唯一关键字。ES6 不仅增加了 let 和 const 两个关键字,而且还让这两个关键字压倒性地超越 var

成为首选。

1. 使用 var 的函数作用域声明

在使用 var 声明变量时,变量会被自动添加到最接近的上下文。在函数中,最接近的上下文就是函

数的局部上下文。在 with 语句中,最接近的上下文也是函数上下文。如果变量未经声明就被初始化了,

那么它就会自动被添加到全局上下文,如下面的例子所示:

function add(num1, num2) {  var sum = num1 + num2;  return sum;
}
let result = add(10, 20); // 30
console.log(sum); // 报错:sum 在这里不是有效变量 

这里,函数 add()定义了一个局部变量 sum,保存加法操作的结果。这个值作为函数的值被返回,

但变量 sum 在函数外部是访问不到的。如果省略上面例子中的关键字 var,那么 sum 在 add()被调用

之后就变成可以访问的了,如下所示:

function add(num1, num2) {  sum = num1 + num2;  return sum;
}
let result = add(10, 20); // 30
console.log(sum); // 30 

这一次,变量 sum 被用加法操作的结果初始化时并没有使用 var 声明。在调用 add()之后,sum

被添加到了全局上下文(window.sum),在函数退出之后依然存在,从而在后面可以访问到。

var 声明会被拿到函数或全局作用域的顶部,位于作用域中所有代码之前。这个现象叫作“提升”

(hoisting)。提升让同一作用域中的代码不必考虑变量是否已经声明就可以直接使用。可是在实践中,提

升也会导致合法却奇怪的现象,即在变量声明之前使用变量。下面的例子展示了在全局作用域中两段等

价的代码:

var name = "Jake";
// 等价于:
name = 'Jake';
var name;  

下面是两个等价的函数:

function fn1() {  var name = 'Jake';
}
// 等价于:
function fn2() {  var name;  name = 'Jake';
}  

通过在声明之前打印变量,可以验证变量会被提升。声明的提升意味着会输出 undefined 而不是

Reference Error:
console.log(name); // undefined
var name = 'Jake';
function() {  console.log(name); // undefined  var name = 'Jake';
}  

添加控制器 提示找到不到上下文_JS局部上下文和全局上下文相关推荐

  1. Linux:上下文,进程上下文和中断上下文概念,上下文切换

    Linux:上下文,进程上下文和中断上下文概念,上下文切换 1. 上下文 context:(就是一个环境) 2. 进程上下文 2.1 进程上下文的三个部分:用户级上下文.寄存器上下文以及系统级上下文 ...

  2. ASP.NET MVC系列:添加控制器

    基于MVC的应用程序包含三个部分 Models(模型):对应用程序的数据进行处理 Views(视图):动态生成HTML,显示数据 Controllers(控制器):应用程序中处理用户交互的部分,处理浏 ...

  3. EntityFramework Core 3.x添加查询提示(NOLOCK)

    前几天看到有博客园中有园友写了一篇关于添加NOLOCK查询提示的博文,这里呢,我将介绍另外一种添加查询提示的方法,此方式源于我看过源码后的实现,孰好孰歹,请自行判之,接下来我们一起来看看. 在Enti ...

  4. 在计算机中添加用户名和密码是多少,在win7系统中添加网络打印机提示输入用户名和密码的解决方案...

    无论谁在使用计算机安装网络打印机需要用户名和密码,您都可能会发现添加网络打印机提示输入用户名和密码的问题. 添加网络打印机提示输入用户名和密码对于用户来说是非常痛苦的. 到底是怎么回事?添加网络打印机 ...

  5. 计算机win10添加用户名和密码是什么情况,win10系统添加网络打印机提示输入用户名和密码的图文方法...

    有关win10系统添加网络打印机提示输入用户名和密码的操作方法想必大家有所耳闻.但是能够对win10系统添加网络打印机提示输入用户名和密码进行实际操作的人却不多.其实解决win10系统添加网络打印机提 ...

  6. Arc Engine 中添加气泡提示框

    一.在ArcMap中的定位操作 已知若干点的经纬度坐标,要求在地图中进行定位: 1.通过Tool >Add X Y data 定位点,注意选择地理坐标系下的wgs 1984坐标系: 2.定位后的 ...

  7. ASP.NET MVC 5 学习教程:添加控制器

    ASP.NET MVC 5 学习教程:添加控制器 原文 ASP.NET MVC 5 学习教程:添加控制器 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控 ...

  8. LiteIDE 在 Windows 下为 Go 语言添加智能提示代码补全

    本文以 Windows 7 64 位为环境,go1.4.2.windows-amd64 和 liteidex27.2.1.windows-qt5 为例. 成功搭建开发环境后,发现 LiteIDE 没有 ...

  9. 有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王 猜数游戏:从键盘中任意输入一个名称,判断数列中是否包含此名称【顺序查找】 要求: 如果找到了,就提示找到,并给出下标值

    有一个数列:白眉鹰王.金毛狮王.紫衫龙王.青翼蝠王 猜数游戏:从键盘中任意输入一个名称,判断数列中是否包含此名称[顺序查找] 要求: 如果找到了,就提示找到,并给出下标值 如果有多个查找结果,都找出来 ...

最新文章

  1. 修改centos默认启动级别为字符模式
  2. linux shell实现随机数多种方法(date,random,uuid)
  3. asp.net编程基础
  4. Fedora16 安装相关
  5. 你还不明白如何解决分布式Session?看这篇就够了!
  6. springboot 设置全局字符编码,解决乱码问题
  7. 大数据的价值体现在哪几个方面,大数据领域未来的技术方向是什么?
  8. oracle peoplesoft enterprise,Solix实现与Oracle PeopleSoft Enterprise9.1整合
  9. 实战篇:VMware Workstation 虚拟机安装 Linux 系统
  10. 网站使用第三方Steam帐号登录[OpenID]
  11. 工作表单元格区域另存为图片
  12. 高性能信号发生器介绍
  13. Goland / Mac - 安装 HelloWorld Demo
  14. 【应用随机过程】02. 马尔可夫链及其概率分布
  15. mui native.js 调用本地视频播放器
  16. STM32 - Printf重定向使用微库、不使用微库(Keil) (转载)
  17. 项目开发 | 转载 | 需求评审与技术评审
  18. BiLSTM+CRF(二)命名实体识别
  19. ECHARTS-MAP的使用: 中国地图及省份边界的查看
  20. 收费邮箱价格及容量对比,收费邮箱与免费邮箱的区别?

热门文章

  1. C#与Java之比较
  2. 苹果笔记本单独安装win10
  3. Poj 1503 Integer Inquiry
  4. SecureCRT用证书方式登录
  5. 老题新理解-在话winform之间的窗体传值
  6. oracle 创建用户
  7. CentOS6下Xen 4.1的安装(编译linux3.0内核)
  8. 如何实现多风格选择 样式实时切换?
  9. python实现关键词提取
  10. CAFFE(FAQ.2):Ubuntu 配置caffe 框架之数据库读取,错误解决:ImportError: No module named leveldb解决办法...