这个是学习 ES6 以及 ES6 + 新语法特性的笔记。
1. 全局作用域
在 JS
里定义一个全局变量
1 | var a =12; |
定义变量的另外一种方式:
1 | b = 1234; |
虽然这个和上面的表达式都具有全局作用域。严格来说,这个表达式不可以被称之为全局变量。变量 a
是作为全局变量使用,b
是作为全局对象 window
的属性来使用的。定义的变量是不可以通过delete
被删除的,而属性是可以被delete
删除的。
1 | delete a; // false |
2. 函数作用域
在函数内部定义的变量,外部无法访问。
1 | function test(){ |
将函数内部定义的变量传递到函数外部的方法:
- 通过 return 的方式,将变量传递出去。
- 通过闭包的方式。
3. 块级作用域
1 | function test(){ |
4. 动态作用域
1 | this 是动态指向的,它的作用域就是动态的。 |
5.let
let 定义变量的特点:
let 定义的变量具有全局作用域。
let 定义的变量不能挂载到全局对象 window 上面。
let 不能重复定义一个变量。
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 定义变量的特点:
const 定义的基础类型变量是常量,声明之后不可以更改。定义的引用类型的变量,可以修改其属性。
const 不允许先声明,后定义。
1
2const a
a = 1先定义
a
再去声明a
会报错。//error
7.习题
7.1 习题一
请问下面的代码输出是什么?如何能根据 i 的顺序输出?
1 | for (var i = 0; i < 3; i++) { |
输出顺序:0 1 2 3 3 3
此处涉及两个知识点:
同步和异步的执行顺序。
var 的作用域
在这里 setTimeout()
是一个异步调用的函数,所以它会最后输出,哪怕它的第二个参数是 0 ,在上述代码中,它也是最后输出 。
因为是异步的输出方式,所以实际上相当在开始输出的时候所有的 i
都是以 var i = 3;
输出。
解决办法:将 var
改成 let
即可实现根据 i
的顺序进行输出。
7.2 习题二
请问下面的代码会发生什么?
1 | console.log(a); |
此处会报错 Cannot access 'a' before initialization