1+ <!DOCTYPE html>
2+ < html lang ="en ">
3+ < head >
4+ < meta charset ="utf-8 ">
5+ </ head >
6+ < body >
7+
8+ < script src ="babel-core/browser.js "> </ script >
9+ < script type ="text/babel ">
10+ /**
11+ * 1 let
12+ */
13+ // 1.1 let的作用域为块级作用域,ES6 允许块级作用域的任意嵌套,块级作用域的出现,实际上使得立即执行函数表达式(IIFE)不再必要
14+ {
15+ let a = 10 ;
16+ var b = 1 ;
17+ }
18+ // console.log(a);
19+ console . log ( b ) ; //1
20+
21+ // 1.2 let适用于for循环,for循环有一个特别之处,循环语句部分是一个父作用域,而循环体内部是一个单独的子作用域
22+ var a = [ ] ;
23+ for ( let i = 0 ; i < 10 ; i ++ ) {
24+ a [ i ] = function ( ) {
25+ console . log ( i ) ;
26+ } ;
27+ }
28+ for ( let i = 0 ; i < 3 ; i ++ )
29+ console . log ( i ) ; // 正常输出,也算块级作用域,即使没有{}
30+ a [ 6 ] ( ) ; // 6
31+ // console.log(i); // 报错
32+
33+ // 1.3 let命令要求必须先声明后使用,且不允许重复声明
34+ // var
35+ console . log ( foo ) ; // 输出undefined
36+ var foo = 2 ;
37+ // let
38+ console . log ( bar ) ; // 报错ReferenceError
39+ let bar = 2 ;
40+ // 暂时性死区:只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响
41+ var tmp = 123 ;
42+ if ( true ) {
43+ tmp = 'abc' ; // ReferenceError
44+ let tmp ; // 在let声明变量前,对tmp赋值会报错。
45+ }
46+
47+ // 1.4 在没有let之前,typeof运算符是百分之百安全的,永远不会报错。但使用let,在let声明前使用typeof会报错
48+
49+ // 1.5 两种 ES5 非法函数声明
50+ // // 情况一
51+ // if (true) {
52+ // function f() {}
53+ // }
54+ // // 情况二
55+ // try {
56+ // function f() {}
57+ // } catch(e) {}
58+ // 考虑到环境导致的行为差异太大,应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句
59+ // 函数块级作用域的声明必须在大括号中
60+ // 不报错
61+ 'use strict' ;
62+ if ( true ) {
63+ function f ( ) { }
64+ }
65+ // // 报错
66+ // 'use strict';
67+ // if (true)
68+ // function f() {}
69+
70+ /**
71+ * 2 do 表达式
72+ */
73+ // 在块级作用域之前加上do,使它变为do表达式,可以获取块级表达式中的值
74+ // 变量x会得到整个块级作用域的返回值
75+ /*
76+ let x = do {
77+ let t = f();
78+ t * t + 1;
79+ };
80+ */
81+ // console.log(x);
82+
83+ /**
84+ * 3 const
85+ */
86+ // const的作用域与let命令相同:只在声明所在的块级作用域内有效,也不提升
87+ const PI = 3.1415 ; // 不能只声明不赋值,也不能修改
88+ // const的本质是锁定变量的地址,对于对象,锁定的仅是引用。如果想将对象冻结,应该使用Object.freeze方法
89+ const fo = { } ;
90+ fo . prop = 123 ;
91+ console . log ( fo . prop ) ; // 123
92+ // foo = {}; // TypeError: "foo" is read-only
93+ // const fo = Object.freeze({});
94+ var constantize = ( obj ) => {
95+ Object . freeze ( obj ) ;
96+ Object . keys ( obj ) . forEach ( ( key , i ) => {
97+ if ( typeof obj [ key ] === 'object' ) {
98+ constantize ( obj [ key ] ) ;
99+ }
100+ } ) ;
101+ } ;
102+
103+ /**
104+ * 4 ES6 声明变量的六种方法
105+ */
106+ // ES5:var命令、function命令
107+ // ES6:let命令、const命令、import命令、class命令
108+
109+ /**
110+ * 5 顶层对象的属性
111+ */
112+ // ES6为了保持兼容性,var命令和function命令声明的全局变量,依旧是顶层对象的属性
113+ // let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性
114+ var aa = 1 ;
115+ console . log ( window . aa ) ; // 1
116+ let bb = 1 ;
117+ console . log ( window . bb ) ; // undefined
118+ // global
119+
120+ </ script >
121+
122+ </ body >
123+ </ html >
0 commit comments