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

var关键字作用域及函数名访问变量疑问:prop1为何可在函数体外访问?

嘿,这个问题问到点子上了,咱们把它拆成两部分讲清楚:

var关键字的作用域规则

在JavaScript里,var声明的变量遵循函数作用域规则:

  • 如果你在函数内部用var声明变量,这个变量只能在该函数内部(包括嵌套在它里面的子函数)访问,函数外部完全拿不到它。
  • 要是在函数外部用var声明,那它就是全局作用域变量(浏览器环境下挂载在window对象上)。
  • 另外var还有变量提升的特性,但这里咱们重点聚焦作用域逻辑。
代码里的两个prop1根本不是同一个东西

你代码里出现的两个prop1只是名字相同,但本质完全不同:

  1. 函数内部的var prop1 = 10;:这是myFunc函数的局部变量,它的作用域被严格限制在myFunc函数体内(不过因为闭包,内部的myChildFunc可以访问它),函数外部是绝对访问不到这个变量的。
  2. myFunc.prop1 = 20;:这里的prop1是函数对象myFunc的属性。因为在JS里,函数本身就是一个Function类型的对象,你可以像给普通对象添加属性一样,给函数对象加任意属性。这个属性和上面的局部变量没有任何关联,只是名字碰巧重合了而已。

再梳理下代码的执行逻辑:

  • 调用myFunc();时,函数内部创建了局部变量prop1=10,同时给this(这里直接调用函数,this指向全局对象window)添加了myChildFunc方法,这个方法借助闭包能访问到内部的局部prop1。
  • 之后myFunc.prop1 = 20;是给myFunc这个函数对象本身添加了一个名为prop1的属性,值设为20。
  • 最后alert("prop1:" + myFunc.prop1);弹出的是函数对象的属性值20,和函数内部的局部变量prop1完全没关系。

简单说:你误以为是访问了函数内部的prop1,但其实是给函数对象本身加了一个同名属性,这俩是完全独立的东西。

内容的提问来源于stack exchange,提问作者Garvit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 15:03:09