- A+
JavaScript 笔记 1
参考书籍:JavaScript权威指南、JavaScript高级程序设计
变量和赋值
变量可以保存任何类型的数据。
var
在所有版本中均可使用,const
和let
只能在ES6及之后的版本可用
var声明
-
可以反复多次声明同一个变量
-
定义变量并赋予初值之后,可以改变保存的值,也可也改变值的类型
var tcher = "理松"; tcher = 438; var tcher = "理松38"; var tcher = 9060;
声明的作用域
被包含在函数内部时用var
声明会成为其局部变量,在函数退出时将被;
去掉var
则会成为全局变量,但极其不推荐这样写,在严格模式下可能导致抛出ReferenceError
要定义多个变量时。可在一条语句中用逗号分割每个变量,可选初始化,逗号之间可以插入换行和空格缩进以便于阅读和理解:
var tcher = "理松", age = 45, welcome = false;
声明提升(hoist)
使用var
声明的所有变量,变量的定义会自动提升到函数作用域顶部
以下代码不会报错:
function foo() { console.log(age); var age = 45; } foo();
运行时被等价为:
function foo() { var age; console.log(age); age = 45; } foo();
let声明
与var
的作用差不多,但有所区别
声明的作用域
作用域为块作用域,是函数作用域的子集
不允许同一个块作用域中出现冗余声明,但嵌套使用相同标识符不会报错
没有声明提升
在let
声明之前的执行瞬间被成为“暂时性死区”(temporal dead zone)
,在此阶段引用任何后面才声明的变量都会抛出ReferenceError
不能进行条件声明
条件声明是一种反模式,它让程序更难理解。如果发现自己在使用这个模式,一定有更好的替代方式
if(typeof name === "undefined") { let name; } name = "理松";
for循环中的声明
在使用let
声明迭代变量时,JavaScript引擎会在后台为每个迭代循环声明一个新的迭代变量,这种行为适用于所有风格的for
循环,包括for-in
和for-of
for(var i = 0; i < 5; ++i) { } console.log(i); //5 for(let i = 0; i < 5; ++i) { } console.log(i); //ReferenceError for(var i = 0; i < 5; ++i) { setTimeout( () => console.log(i), 0) } //你以为的输出:0 1 2 3 4 //实际上的输出:5 5 5 5 5 for(let i = 0; i < 5; ++i) { setTimeout( () => console.log(i), 0) } //实际上的输出:0 1 2 3 4
每个setTimeout引用的都是不同的变量实例,所以会输出循环执行过程中每个迭代变量的值
const声明
用于声明常量,行为与let
基本相同,但声明时必须初始化。
-
声明后不可改变
-
不允许重复声明
-
块作用域
-
不能用于声明迭代变量
-
可以用来声明一个不会被修改的
for
循环变量