函数表达式作为对象方法时无提升、作用域独立、this动态绑定、可借闭包访问外层变量:它只在赋值后可用,内部变量仅限函数体内,this取决于调用方式,若在嵌套函数中定义则能形成闭包。

函数表达式在对象方法中定义时,它的作用域规则和普通函数表达式一致:它只在声明位置之后可用,且其内部变量遵循函数作用域(局部作用域)规则;但作为对象属性,它仍能通过 this 访问对象自身,而不能直接访问外层函数的局部变量——除非显式捕获或绑定。
函数表达式作为方法时,没有“提升”
当把函数表达式赋值给对象属性时,它不会被提前声明或初始化。这意味着:
- 不能在赋值语句之前调用该方法,否则报
TypeError: obj.say is not a function; - 它不像函数声明那样有“函数提升”,只随赋值执行而创建;
- 即使写在对象字面量里,也属于运行时求值,不是预编译阶段就存在的可调用实体。
方法内部的变量作用域是独立的
函数表达式定义的方法,其内部声明的变量(用 var、let 或 const)仅在该函数体内有效:
- 无法从对象外部直接读取这些变量;
- 不同方法之间互不共享局部变量,哪怕它们属于同一个对象;
- 若需共享数据,应存为对象属性(如
obj.count),而非方法内局部变量。
this 指向取决于调用方式,不是定义位置
函数表达式作为方法,this 不由“怎么写的”决定,而由“怎么调的”决定:
-
obj.say()→this是obj; -
const fn = obj.say; fn()→this是window(非严格模式)或undefined(严格模式); - 若需固化
this,可用bind、箭头函数(注意:箭头函数不绑定this,而是继承外层词法this),或在构造时用class+ 实例方法。
闭包可访问外层函数作用域,但需主动捕获
如果函数表达式是在另一个函数内部定义的,它可以形成闭包,访问外层函数的局部变量:
- 例如,在工厂函数中返回一个对象,其方法是函数表达式,就能记住外层的参数或变量;
- 但这种访问依赖于闭包机制,不是对象方法本身的特性;
- 若外层函数已执行完毕,只要闭包还存在,那些变量就不会被垃圾回收。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











