<!doctype html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script>
function fn(a){
console.log(a);
var a = 123;
console.log(a);
function a (){}
console.log(a);
var b = function(){}
console.log(b);
function d(){}
}
fn(1);
</script>
</body>
</html>
以上代码的输出结果为:ƒ a (){}
123
123
ƒ (){}
这是因为在函数执行前一刻,有个预编译的过程,分为四步:
1、创建AO对象,也就是函数执行上下文
2、找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
3、将实参值和形参统一
4、在函数体里面找函数声明,值赋予函数体
在fn(1)执行前一刻,AO对象的值为{ a:function a(){} , b:undefined , d:function d(){}},因此在执行第一句输出a的值时为function a(){}