预解析
分为变量预解析(变量提升)和函数预解析(函数提升)
变量提升
把所有变量声明提升到当前作用域的最前面,不提升赋值操作
- 一个未定义的变量直接使用会报错
console.log(num); // Uncaught ReferenceError: num is not defined
- 在使用一个之后定义的变量,不会报错,但是没有值,体现了变量提升的效果
console.log(num); // undefined
var num = 10;
- Tips:如果变量使用let定义,会直接报错
console.log(num); // ReferenceError: Cannot access 'num' before initialization
let num = 10;
函数提升
把所有函数声明提升到当前作用域的最前面,不提升调用
fn();
function fn(){
console.log(11);// 11
}
- 如果采用变量的方式定义函数,会导致执行失败
fun();//index.html:20 Uncaught TypeError: fun is not a function
var fun = function(){
console.log(22);
}
实际上提升了变量,但是没有提升函数定义,函数在赋值时将值赋到变量上
arguments的使用
JavaScript在调用函数时可以传入多个入参,而函数如果需要这种多个入参的形式去定义的话,需要获取到入参列表。
arguments就是存储传递的参数的对象
function arg(){
console.log(arguments);
}
arg(1,2,3);
arguments是一个伪数组,具有数组的length属性,也可以按照索引的方式进行获取元素,但是没有真正数组的一些方法
如:pop()
、push()
等
数据类型
基本数据类型
又叫做简单类型或者值类型
简单数据类型/基本数据类型,在储存时变量中储存的是值本身,因此叫做值类型string
, number
,boolean
,undefined
,null
其中null较为特殊,当一个变量赋值为null时,此变量的type of
打印的是object
引用类型
复杂数据类型,地址引用,储存在堆内存中
参数传递
- 基本数据类型在栈中储存,作为参数传递时将自身复制一份传入函数内,函数对值的修改不会影响作用域外的值
- 引用数据类型在栈中储存的是地址,作为参数传递时将地址传入函数内,函数对该对象的修改会影响堆中存储的数据,导致作用域外取到的对象发生改变
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。