Skip to content

Commit 21ac39e

Browse files
ES6 init
1 parent 12936b1 commit 21ac39e

File tree

279 files changed

+104802
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

279 files changed

+104802
-0
lines changed

6 ES6/01 let & const.html

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
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

Comments
 (0)