var声明变量的作用域限制在其声明位置的上下文中

var x = 0;  // x是全局变量,并且赋值为0。

console.log(typeof z); // undefined,因为z还不存在。

function a() { // 当a被调用时,
var y = 2; // y被声明成函数a作用域的变量,然后赋值成2。 console.log(x, y); // 0 2 function b() { // 当b被调用时,
x = 3; // 全局变量x被赋值为3,不生成全局变量。
y = 4; // 已存在的外部函数的y变量被赋值为4,不生成新的全局变量。
z = 5; // 创建新的全局变量z,并且给z赋值为5。
} // (在严格模式下(strict mode)抛出ReferenceError) b(); // 调用b时创建了全局变量z。
console.log(x, y, z); // 3 4 5
} a(); // 调用a时同时调用了b。
console.log(x, z); // 3 5
console.log(typeof y); // undefined,因为y是a函数的本地(local)变量。

let 声明的变量只在其声明的块或子块中可用,var的作用域是整个封闭函数

function varTest() {
var x = 1;
if (true) {
var x = 2; // 同样的变量!
console.log(x); //
}
console.log(x); //
} function letTest() {
let x = 1;
if (true) {
let x = 2; // 不同的变量
console.log(x); //
}
console.log(x); //
}

在 ECMAScript 2015 中,let绑定不受变量提升的约束,这意味着let声明不会被提升到当前执行上下文的顶部。

在块中的变量初始化之前,引用它将会导致 ReferenceError(而使用 var 声明变量则恰恰相反,该变量的值是 undefined

当在块中使用时,let将变量的作用域限制为该块。注意var的作用域在它被声明的函数内的区

var a = 1;
var b = 2; if (a === 1) {
var a = 11; // the scope is global
let b = 22; // the scope is inside the if-block console.log(a); //
console.log(b); //
} console.log(a); //
console.log(b); //

const 常量必须在声明的同时指定它的值.

const声明创建一个值的只读引用。但这并不意味着它所持有的值是不可变的(如引用内容是对象),只是变量标识符不能重新分配

一个常量不能和它所在作用域内的其他变量或函数拥有相同的名称

// 注意: 常量在声明的时候可以使用大小写,但通常情况下全部用大写字母。 

// 定义常量MY_FAV并赋值7
const MY_FAV = 7; // 报错
MY_FAV = 20; // 输出 7
console.log("my favorite number is: " + MY_FAV); // 尝试重新声明会报错
const MY_FAV = 20; // MY_FAV 保留给上面的常量,这个操作会失败
var MY_FAV = 20; // 也会报错
let MY_FAV = 20; // 注意块范围的性质很重要
if (MY_FAV === 7) {
// 没问题,并且创建了一个块作用域变量 MY_FAV
// (works equally well with let to declare a block scoped non const variable)
let MY_FAV = 20; // MY_FAV 现在为 20
console.log('my favorite number is ' + MY_FAV); // 这被提升到全局上下文并引发错误
var MY_FAV = 20;
} // MY_FAV 依旧为7
console.log("my favorite number is " + MY_FAV); // 常量要求一个初始值
const FOO; // SyntaxError: missing = in const declaration // 常量可以定义成对象
const MY_OBJECT = {"key": "value"}; // 重写对象和上面一样会失败
MY_OBJECT = {"OTHER_KEY": "value"}; // 对象属性并不在保护的范围内,下面这个声明会成功执行
MY_OBJECT.key = "otherValue"; // 也可以用来定义数组
const MY_ARRAY = [];
// It's possible to push items into the array
// 可以向数组填充数据
MY_ARRAY.push('A'); // ["A"]
// 但是,将一个新数组赋给变量会引发错误
MY_ARRAY = ['B']

以上内容摘录MDN Web文档  未完待续

 

JavaScript变量声明var,let.const的更多相关文章

  1. javaScript 变量提升 var let const,以及JS 的解析阶段和执行阶段

    我们先来看一道面试题,大家猜想一下,下面这段代码,打印出来的结果是什么 var name = 'World!'; (function () { if (typeof name === 'undefin ...

  2. JavaScript变量声明与变量声明提前

    JavaScript变量声明 JavaScript中存储数据的容器称为变量.用关键字和标识符创建新变量的语句,称为变量声明.可以通过关键字var进行变量声明,在ES6中增加了let.const关键字声 ...

  3. javascript变量声明 及作用域

    javascript变量声明提升(hoisting) http://openwares.net/js/javascript_declaration_hoisting.html 可能要FQ一下 java ...

  4. 【转】javascript变量声明 及作用域

    javascript变量声明提升(hoisting) javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面. 先看 ...

  5. javascript变量声明及作用域总结

    javascript变量声明及作用域总结 一.总结 一句话总结:还是得好好看书,光看视频是不得行的,浅学无用,要相互印证,要真正理解才有用,比如<Javascript权威指南> 书 1.j ...

  6. JavaScript 变量声明提升

    JavaScript 变量声明提升 一.变量提升的部分只是变量的声明,赋值语句和可执行的代码逻辑还保持在原地不动 二.在基本的语句(或者说代码块)中(比如:if语句.for语句.while语句.swi ...

  7. JavaScript变量声明及赋值

    1.变量声明 var a; //声明一个变量 a var b,c,d; //同时申明多个变量时,变量名之间用逗号隔开 console.log(a); //在控制台显示变量a的值,输出为undefine ...

  8. 浅谈JavaScript变量声明提升

    前段时间阿里实习生内推,一面就被刷了,也是郁闷.今天系统给发通知,大致意思就是内推环节不足以了解彼此,还可以参加笔试,于是赶紧再投一次.官网流程显示笔试时间3月31日,时间快到了,开始刷题.网上搜了一 ...

  9. JavaScript 变量声明:var、let、const

    1. 概述 1.1 说明 在ES5 声明变量的方法:var命令和function命令. 在ES6 声明变量的方法:var命令.function命令.let命令.const命令.import命令.cla ...

随机推荐

  1. Nginx性能调优之buffer参数设置

    Nginx 的缓存功能有:proxy_cache / fastcgi_cache proxy_cache的作用是缓存后端服务器的内容,可能是任何内容,包括静态的和动态.fastcgi_cache的作用 ...

  2. js:基于原生js的上啦下啦刷新功能

    链接:https://www.jianshu.com/p/a8392115e6f0演示地址:http://wonghan.cn/iscroll-demo/html:<body> <d ...

  3. shift() 方法从数组中删除第一个元素,并返回该元素的值。此方法更改数组的长度。

    let a = [1, 2, 3]; let b = a.shift(); console.log(a); // [2, 3] console.log(b); // 1 返回值 从数组中删除的元素;  ...

  4. ssh命令详解

    1.简介: Secure Shell(缩写为SSH),由IETF的网络工作小组(Network Working Group)所制定:SSH为一项创建在应用层和传输层基础上的安全协议,为计算机上的She ...

  5. week08 S8-01 docker images tensorflow-jupyter

    rt 官网http://jupyter.org/ 安装 一种是 npm install的方式 这种需要自己配置 python和那个tansflow很麻烦 推荐使用docker方式 登录 docker ...

  6. Day05 -寻找自己:Ruby的self物件与singleton method

    前情提要:在第四天里,我们用参赛者的例子解说实体方法与类别方法.类别中的实体物件,想要玩弄方法时,可以有三种取用方式:(跟斯斯有三种一样) 该类别所定义的实体方法. 模块中可取得的实体方法.(关于模块 ...

  7. spring @Autowired与@Resource的区别

    1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. 2.@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必 ...

  8. docker学习-lnmp+redis之搭建redis容器服务

    1. 目录映射:/lnmp/data/redis:/data/lnmp/conf/redis/redis.conf:/etc/redis/redis.conf/lnmp/logs/redis:/var ...

  9. pandas列操作集锦

    列操作 pandas的列操作 数据准备: 增 将两张表合并到一起 pd.concat([page_001,page_002]).reset_index(drop=True) 默认从上到下合,如果想从左 ...

  10. (Solved) Nexiq USB link with CAT ET: connection error 149

    User issue: I'm using a Nexiq USB link with CAT ET 2011b and I need some help with connection settin ...