预解析

分为变量预解析(变量提升)和函数预解析(函数提升)

变量提升

把所有变量声明提升到当前作用域的最前面,不提升赋值操作

  • 一个未定义的变量直接使用会报错
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

引用类型

复杂数据类型,地址引用,储存在堆内存中

参数传递

  • 基本数据类型在栈中储存,作为参数传递时将自身复制一份传入函数内,函数对值的修改不会影响作用域外的值
  • 引用数据类型在栈中储存的是地址,作为参数传递时将地址传入函数内,函数对该对象的修改会影响堆中存储的数据,导致作用域外取到的对象发生改变

奶粥
6 声望0 粉丝

xiao海无涯苦揍舟~