本人今天去面试,去了一个大厂面试,也遇到了一位30多年岁的前端大神,他面试了我一些js基础知识,什么是js预编译,我回答了作用域之类的知识,面试管对我的答案有点失望,我回家之后,对这个问题进行一些研究,这个问题确实很有学问,不过也很有意思,哈哈哈哈,下面我们来一起看看。
什么是预编译?
预编译的四部曲 (这四句是重中之重,当你理解他的时候,对于预编译之类的题目不再话下,百战百胜,哥不吹牛逼)
1 创建oa对象
2找到形参和变量声明,将变量和形参作为ao属性名,值为undefined
3,将实参和形参统一
4,在函数体内找函数声明,赋值函数声明
下面是找到一个百度面试的题目,我们就来分析他把
创建 ao对象
ao:{ }
找到形参和变量声明,将变量和形参作为ao属性名,值为undefined
ao:{ a:undefined, foo:undefined}
将实参和形参统一
ao:{ a:undefined, foo:undefined}
函数内部有实参和形参,函数变量声明 ao:{ a:1, foo:function(){}}
到这里预编译就算完成了,开始执行了
console.log(a) //这里的结果一定是1咯 因为ao 里面a是1
console.log(bar(1)); 这里的结果一定是函数了 因为ao function(){} return 下面的东西不会执行,因为return foo; 已经把东西返回出去了,而且组织了代码的执行。
皮友们,是不是很简单,哈哈,以后遇到这种问题,啥也不怕了,直接怼面试官。
function bar(a){
console.log(a)
return foo;
foo=10;
function foo(){
}
var foo=11
}
console.log(bar(1));//function(){}