有两个阶段,分别为分析阶段和执行阶段。
词法分析(优先级如下)
1.分析参数
2.分析函数声明
3.分析变量声明
参数声明会比函数声明优先级更高,如果已有同名参数声明,该参数声明将会被函数声明覆盖。
函数声明会比var声明优先级更高,如果已有同名函数声明,该变量声明undefined将会直接跳过。
function t(userName) {
console.log(userName);//这里输出什么?
function userName() {
console.log('tom');
}
}
t('toby');
//ƒ userName() {
console.log('tom');
}
这里是因为userName先等于函数参数‘toby’,然后被函数声明覆盖,userName为整个函数的函数引用,所以输出函数体
function t(userName) {
console.log(userName);//这里输出什么?
var userName = function () {
console.log('tom');
}
}
t('toby');
//toby
这里是因为userName先等于函数参数‘toby’,然后遇到变量声明(此处没有函数声明,因为是赋值表达式),变量声明提升undefined,直接跳过,所以输出仍然是‘toby’
此处要弄清楚函数声明与函数表达式的区别