构造函数中函数的作用域和this绑定取决于定义方式:函数声明会被提升但仅限内部访问;函数表达式需先定义后使用,箭头函数继承外层this;漏写var/let/const会导致全局污染。

在类构造函数中声明或引用函数时,作用域行为取决于函数的定义方式(声明式还是表达式)、声明位置(内部还是外部),以及变量声明的关键字(var、let、const)。关键不是“能不能用”,而是“在哪能访问、绑定谁的 this、是否被提升”。
构造函数内部的函数声明会被提升
在类的构造函数体中使用 function fn() {} 这种语法声明函数,属于**函数声明语句**。它会像普通函数声明一样被提升到当前作用域(即构造函数作用域)顶部,但仅限于该次函数调用的作用域内:
- 该函数只能在构造函数内部访问,外部无法直接调用
- 它能访问构造函数参数和
this(但需注意:若作为回调传出去,this可能丢失) - 它不会成为实例属性,也不会挂载到
prototype上
函数表达式不受提升影响,必须先定义再使用
如果写成 const helper = function() { ... }; 或 const helper = () => { ... };,这就是函数表达式:
-
let/const声明存在暂时性死区(TDZ),在声明前访问会报ReferenceError -
var声明虽有变量提升,但赋值不提升,调用时可能得到undefined - 箭头函数没有自己的
this,它继承外层(即构造函数执行时)的this,通常就是新创建的实例
嵌套函数对 this 的绑定取决于调用方式
构造函数里定义的函数,其 this 指向不自动绑定到实例,除非显式处理:
立即学习“Java免费学习笔记(深入)”;
- 直接调用
helper()→this是undefined(严格模式)或全局对象(非严格) - 通过
this.helper = helper.bind(this)绑定后,可安全作为事件回调或异步回调 - 用箭头函数定义:
const helper = () => this.doSomething(),天然捕获构造时的this
避免意外的全局变量污染
构造函数中若漏写 let/const/var 就直接赋值,比如 helper = function() {},该变量会变成全局属性(浏览器中挂到 window),且所有实例共享同一份函数 —— 这不是闭包,是错误的全局泄露:
- 后果:多个实例调用时可能互相干扰,调试困难,内存泄漏风险
- 修复:始终用
const或let显式声明,或明确挂载到this上(如this.helper = ...)


















