js 内存进阶 function扫描解析
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<script type="text/javascript">
//情况1
var fn = function(){ //在栈中,匿名函数,赋值给变量
alert(1);
};
function fn(){ //在堆中 有名字的函数
alert(2);
}
fn(); // 1
//调用函数的时候先去栈中找有没有定义fn的变量,如果有就根据变量存储的内存地址来执行这个函数
//先定义后执行
//情况2
/*
var fn1 = 3;
function fn1(){
alert(4);
}
fn1(); //fn1 not a function
*/
//情况3
var fn2; //已定义未赋值的变量为undefined
function fn2(){
alert(5);
}
fn2(); //5
//如果fn变量,没有存储内存地址则为undefined,那么就去堆中看看有没有fn的引用名称
//情况4
fn3(); //6 //3.调用fn3
var fn3; //1.先定义fn3 //4.undefined,去堆中找
function fn3(){ //2.再定义函数fn3() //执行 结果为6
alert(6);
}
//情况5
fn4(); //8 //3.调用fn4()
var fn4 = 7; //1.定义变量fn4 //4.赋值
function fn4(){ //2.定义函数fn4()
alert(8);
}
//情况6
var fn5; //1.定义fn5 //3.未赋值 undefined
fn5(); //9 //调用执行fn5(),发现fn5未赋值,直接去堆中找fn5()
function fn5(){ 2.定义函数fn5()
alert(9);
}
//情况7
var fn6 = 10; //1.先定义fn6 //3.将10赋值给fn6
fn6(); //fn6 not a function //4.调用执行fn6(),fn6 not a function
function fn6(){ //定义函数fn6()
alert(11);
}
</script>
</body>
</html>