JavaScript 笔记 1

  • A+
所属分类:Web前端
摘要

参考书籍:JavaScript权威指南、JavaScript高级程序设计变量可以保存任何类型的数据。


JavaScript 笔记 1

参考书籍:JavaScript权威指南、JavaScript高级程序设计

变量和赋值

变量可以保存任何类型的数据。

var在所有版本中均可使用,constlet只能在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-infor-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循环变量