今天同学问到的问题,
function fun(ger){
ger=5;
console.log(ger);
function ger(){
alert(“hello world”);
}
}
fun()
输出的就是5,
可以解释,由于function声明提升,所以去了上面,先声明,后赋值,所以输出5
后面改下代码,不要赋值5了,传参数进去5
function fun(ger){
console.log(ger);
function ger(){
alert(“hello world”);
}
}
fun(5)
最后输出的是function
为什么不是5呢,传递参数5和赋值5有什么区别呢,
最后找答案,有一个机制,
// 1.分析全局变量GO,生成go对象
// GO={
// 全局变量声明:
// 没有略过
// 全局函数声明:
// fun:function;
// }
// 2.逐行执行
// 3.分析AO,生成AO对象
// AO={
// 1.分析参数
// ger:5
// 2.分析变量声明:
// 没有略过
// 3.分析函数声明
// ger:function;
// 重复名称覆盖
// }
// 最后输出:function ger(){
// alert(“hello world”);
// }
从这里可以看出来,参数传递的作用域,是有一个GO对象和AO对象的,
变量5传递进去,先是参数的声明与赋值,然后是变量的声明,最后是函数的声明,因为同名,所以覆盖;