为什么声明式函数与Function对象执行时同名变量输出结果存在差异
差异产生的核心原因
你写的代码存在语法误解,跟在func2()后的花括号代码块完全不属于func2的函数体,二者是独立执行的两部分:
var func2 = new Function()创建的是一个无任何逻辑的空函数,调用func2()时不会执行任何代码,自然也不会有任何输出- 你后续写的
{ ... }是全局作用域下的普通代码块,并不是func2的函数实现,所以才会出现和func1不同的输出表现。
普通代码块的执行逻辑说明
var关键字是函数级作用域,只有在函数内部声明时才会提升到当前函数作用域顶部,在普通块中声明的var变量属于外层作用域(这里就是全局作用域):
- 你在全局已经提前声明并赋值了
var scope = "global",块内的var scope = "local"属于重复声明,不会覆盖之前已有的赋值 - 所以块内第一次打印
scope时,读取的就是全局已经赋值完成的global,赋值后第二次打印就是local,和你看到的输出一致。
验证方法
如果你用new Function实现和func1完全相同的逻辑,写法应该如下:
var func2 = new Function(` console.log(scope); var scope = "local"; console.log(scope); `) func2()
此时调用func2的输出会和func1完全一致:第一行打印undefined,第二行打印local。
内容的提问来源于stack exchange,提问作者kkkk
相关产品推荐
相关产品推荐

