同名函数与变量下typeof运算符的结果差异问题
为什么Chrome控制台逐行执行和一次性执行结果不同?
嘿,这个问题戳中了很多JS新手容易混淆的点——标准脚本执行机制和浏览器控制台执行机制的差异,我来给你掰扯清楚:
1. 一次性执行(或单行执行完整代码)的逻辑
当你把整段代码作为一个完整的脚本执行时,JS引擎会先进行预编译(变量提升):
- 首先,提升所有变量声明:
var count;(此时count是undefined) - 然后,提升所有函数声明:
function count() {}(函数声明优先级高于变量声明,所以此时count被覆盖为这个函数) - 进入执行阶段:执行
var count = 1;,这一步是给count赋值为1,覆盖了之前的函数引用 - 最后
console.log(typeof count)自然输出number,这和你预期的一致
2. Chrome控制台逐行执行的特殊逻辑
Chrome控制台的逐行执行,本质是把每一行代码当作独立的执行单元来处理,而不是作为一个完整的脚本块预编译:
- 执行第一行
var count = 1;:此时全局作用域里的count是number类型的1 - 执行第二行
function count() {};:在全局作用域下单独执行函数声明时,JS引擎会直接把这个函数绑定到全局对象的count属性上,直接覆盖了之前的数值1(因为全局作用域中,变量和函数都是全局对象的属性,后赋值的会覆盖先有的) - 执行第三行
console.log(typeof count):此时count已经是函数了,所以输出function
简单来说,控制台逐行执行跳过了“整段预编译”的步骤,每一步都是即时生效的赋值/声明,自然和一次性执行的结果不一样啦~
内容的提问来源于stack exchange,提问作者Parth Shah
相关产品推荐
相关产品推荐

