You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么声明式函数与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 18:12:02