刘流的博客

ES6基础学习

Word count: 762Reading time: 3 min
2020/08/22 Share

这个是学习 ES6 以及 ES6 + 新语法特性的笔记。

1. 全局作用域

JS 里定义一个全局变量

1
var a =12;

定义变量的另外一种方式:

1
b = 1234;

虽然这个和上面的表达式都具有全局作用域。严格来说,这个表达式不可以被称之为全局变量。变量 a 是作为全局变量使用,b 是作为全局对象 window 的属性来使用的。定义的变量是不可以通过delete被删除的,而属性是可以被delete删除的。

1
2
3
4
5
6
7
delete a; // false
delete b;// true
在函数内部定义的变量,没有使用 var 定义的话,是全局变量。挂载到 window 上面
function fn(){
ab = 100;
}
fn()

2. 函数作用域

在函数内部定义的变量,外部无法访问。

1
2
3
4
5
6
function test(){
var a = 4;
return a+1
}
console.log(test());// 5
console.log(a);// a is not defined

将函数内部定义的变量传递到函数外部的方法:

  1. 通过 return 的方式,将变量传递出去。
  2. 通过闭包的方式。

3. 块级作用域

1
2
3
4
5
6
7
8
9
function test(){
var a = 4;
if (a===4){
let b = 5
}
console.log(b)// error
return a+1
}
test()

4. 动态作用域

1
2
3
4
5
6
7
8
this 是动态指向的,它的作用域就是动态的。
window.a = 3
function test(){
console.log(this.a)
}
// 让函数动态的绑定到一个对象上面去。这个时候的 this 指向这个对象的本身。
test() // 3
test.bind( {a : 100 } )( ) // 100

5.let

let 定义变量的特点:

  1. let 定义的变量具有全局作用域。

  2. let 定义的变量不能挂载到全局对象 window 上面。

  3. let 不能重复定义一个变量。

  4. let 定义的变量不会进行变量的提升。

    1
    2
    3
    4
    5
    6
    7
    8
    {
    let a = 4
    console.log(a) // 4
    }
    console.log(a) //error
    var b = 5
    let c = 6
    console.log(window.a, window.b) // 5, undefined

6.const

const 定义变量的特点:

  1. const 定义的基础类型变量是常量,声明之后不可以更改。定义的引用类型的变量,可以修改其属性。

  2. const 不允许先声明,后定义。

    1
    2
    const a 
    a = 1

    先定义 a 再去声明 a 会报错。//error

7.习题

7.1 习题一
请问下面的代码输出是什么?如何能根据 i 的顺序输出?

1
2
3
4
5
6
for (var i = 0; i < 3; i++) {
setTimeout(function () {
console.log(i);
},1000)
console.log(i);
}

输出顺序:0 1 2 3 3 3
此处涉及两个知识点:

  1. 同步和异步的执行顺序。

  2. var 的作用域

在这里 setTimeout() 是一个异步调用的函数,所以它会最后输出,哪怕它的第二个参数是 0 ,在上述代码中,它也是最后输出 。

因为是异步的输出方式,所以实际上相当在开始输出的时候所有的 i 都是以 var i = 3;输出。
解决办法:将 var 改成 let 即可实现根据 i 的顺序进行输出。
7.2 习题二
请问下面的代码会发生什么?

1
2
console.log(a); 
let a=1

此处会报错 Cannot access 'a' before initialization

CATALOG
  1. 1. 1. 全局作用域
  2. 2. 2. 函数作用域
  3. 3. 3. 块级作用域
  4. 4. 4. 动态作用域
  5. 5. 5.let
  6. 6. 6.const
  7. 7. 7.习题