A-A+

ES6学习之块级作用域

2017年01月02日 默认文章 暂无评论

 注:主要参考understand es6 及阮一峰es6教材。

  1. function getValue(condition) {
  2. if (condition) {
  3. var value = "blue";
  4. // other code
  5. return value;
  6. } else {
  7. // value exists here with a value of undefined 此处value的值存在,但是为undefined。
  8. return null;
  9. }
  10. // value exists here with a value of undefined
  11. }
变量提升。
  1. function getValue(condition) {
  2. var value;
  3. if (condition) {
  4. value = "blue";
  5. // other code
  6. return value;
  7. } else {
  8. return null;
  9. }
  10. }
块级作用域:该声明的变量在代码块外部无法被访问到。也被称为词法作用域。
在如下的条件中创建。
函数内部、代码块内部。
let
let声明不会将变量提升到当前作用域的顶部。在上一个例子中,若将var 改为let ,则后面的value都不会存在。
如果一个标识符在当前作用域已经被声明过了,那么再次声明的话,会报错。( let 不会重新定义已经存在的标识符
  1. var count = 30;
  2. if (condition) {
  3. // doesn't throw an error
  4. let count = 40;
  5. // more code
  6. } // var 声明的count和 let 声明的 count 并不在同一级中
const
const声明的变量一般被    视为常量,故,需在声明处初始化。
  1. // valid constant
  2. const maxItems = 30;
  3. // syntax error: missing initialization
  4. const name;
同let 类似,    const    变量也不会被提升,也不会对已经存在的标识符重复定义。
  1. var message = "Hello!";
  2. let age = 25;
  3. // each of these throws an error
  4. const message = "Goodbye!";
  5. const age = 30;
无论是否是严格模式,const 变量都不允许被重复赋值。
  1. const maxItems = 5;
  2. // throws an error
  3. maxItems = 6;
const    声明只是阻止变量和值的再次绑定而不是值本身的修改。
  1. const person = {
  2. name: "Nicholas"
  3. };
  4. // works
  5. person.name = "Greg";
  6. // throws an error
  7. person = {
  8. name: "Greg"
  9. };
暂存性死区TDZ
  1. if (condition) {
  2. console.log(typeof value); // throws an error
  3. let value = "blue";
  4. }
区别:
全局作用域。
在全局作用域内使用var声明创建的变量是全局对象的一个属性,这个属性很有可能被意外重写。
  1. // in a browser
  2. var RegExp = "Hello!";
  3. console.log(window.RegExp); // "Hello!"
  4. var ncz = "Hi!";
  5. console.log(window.ncz); // "Hi!"
  1. // in a browser
  2. let RegExp = "Hello!";
  3. console.log(RegExp); // "Hello!"
  4. console.log(window.RegExp === RegExp); // false
  5. const ncz = "Hi!";
  6. console.log(ncz); // "Hi!"
  7. console.log("ncz" in window); // false
标签:

给我留言

Copyright © 花未全开月未圆 保留所有权利.   Theme  Ality

用户登录