1.预解析与变量提升

  1. console.log(web)
  2. var web = "sleep"

输出的结果是undefined 实际上代码在运行时解析结果是这样的,将变量的声明放到了前面,所以输出结果是undefined。

  1. var web
  2. console.log(web)
  3. web = "sleep"

这段代码输出的结果依然是undefined,但是如果把var web = “Jay” 注解掉,将无法执行。

  1. function hd() {
  2. if(false){
  3. var web = "Jay"
  4. }
  5. console.log(web)
  6. }

2.let&const暂死区TDC

假设我们使用let的话,这样将无法运行

  1. console.log(web)
  2. let web = "Jay"

函数体使用时找不到变量就会到外部去寻找

  1. let web = "Jay";
  2. function func() {
  3. console.log(web);
  4. }
  5. func();

内部有定义优先使用内部

  1. let web = "Jay";
  2. function func() {
  3. let web = "奶茶天使";
  4. console.log(web);
  5. }
  6. func();

此时的i是没有作用域的,所以最后i输出为5

  1. var i = 99
  2. for (var i = 0; i < 5; i++) {
  3. console.log(i)
  4. }
  5. console.log(i)

var改成let后再执行i=99

  1. var i = 99
  2. for (let i = 0; i < 5; i++) {
  3. console.log(i)
  4. }
  5. console.log(i)

3.声明const的值被修改解决方法与原因

如果不调用myFreeze(esObj)函数,extension中的元素将会被修改

  1. const esObj = {
  2. name: "es6",
  3. page: 2,
  4. extension: [10, 20, 3, 40]
  5. }
  6. Object.freeze(esObj)
  7. /*
  8. 即使冻结后依然可以改变extension的值
  9. 这是因为数组是存储在堆内存(heap)里
  10. 而基本数据类型是存储在栈内存(stack)
  11. 而且freeze只能冻结最外层
  12. */
  13. myFreeze(esObj)
  14. esObj.extension[0] = 12
  15. console.log(esObj)
  16. // 自定义方法使其全部冻结
  17. function myFreeze(obj) {
  18. Object.freeze(obj)
  19. Object.keys(obj).forEach(key => {
  20. if (typeof obj[key] === 'object') {
  21. myFreeze(obj[key])
  22. }
  23. })
  24. }

4.箭头函数this指向

4.1调用链

这段代码输出会报错this调用链查找到外部没有找到address

  1. const obj2 = {
  2. address: "广州",
  3. showAddress= () => {
  4. console.log(this.address)
  5. }
  6. }
  7. obj2.showAddress()

4.2箭头函数无法使用arguments

  1. const sum = (x, y) => {
  2. console.log(arguments)
  3. return x + y
  4. }

4.3不能使用箭头函数作为构造函数

  1. const Course = (name,price)=>{
  2. this.name = name
  3. this.price = price
  4. }

4.4箭头函数不能使用prototype

  1. Course.prototype.study = () =>{
  2. console.log(`学习${this.name},价格是${this.price}`)
  3. }

5.解构赋值正确使用姿势

  1. const esObj = {
  2. name: "es6",
  3. page: 2,
  4. extension: [10, 20, 3, 40],
  5. teacher: {
  6. name: 'jack'
  7. }
  8. }
  9. const {name,page} = esObj
  10. // 取数组
  11. const courseArr = ['e6', 'e7', 'e8']
  12. const [a, b, c] = courseArr
  13. console.log(a, b, c)
  14. // 取内部对象
  15. const { name, page, teacher: {
  16. name: name1 // 重名可以取别名
  17. } } = esObj
  18. console.log(name, page, name1)

6.严格模式use strict

没啥用use strict之前这段代码可以正常执行

  1. var public = "public"
  2. console.log(public)

使用use strict后再执行则会报错

  1. "use strict"
  2. var public = "public"
  3. console.log(public)

6.1严格模式作用域

放到外部就是全局作用域

  1. "use strict"
  2. function show() {
  3. web = "file"
  4. }
  5. function pageView() {
  6. site = "半岛铁盒"
  7. }
  8. show()

放到show函数体中执行时会提示web未定义

  1. function show() {
  2. "use strict"
  3. web = "file"
  4. }
  5. function pageView() {
  6. site = "半岛铁盒"
  7. }
  8. show()

但是执行pageView方法则正常

  1. function show() {
  2. "use strict"
  3. web = "file"
  4. }
  5. function pageView() {
  6. site = "半岛铁盒"
  7. }
  8. pageView()

总结:严格作用域会从当前作用域向下查找,而不会向上查找
学习到章节19