Node.js中this.k赋值在VS Code报错的原因及解决方法
Node.js中this.k赋值在VS Code报错的原因及解决方法
嘿,我来帮你拆解这个问题~
首先说报错的核心原因:你在VS Code里运行的是ES模块(从报错路径的file://前缀能看出来),而Node.js的ES模块默认启用严格模式。在严格模式下,普通函数直接调用时,this的值是undefined,不是全局对象。你在subfun里给this.k赋值,本质是给undefined加属性,自然就会抛出Cannot set properties of undefined的错误。
那为啥在其他地方能运行呢?大概率是那些环境用的是CommonJS模块(比如文件后缀是.cjs,或者package.json里没设置"type": "module"),CommonJS模块里普通函数直接调用时,this指向全局的global对象,给它加属性当然不会报错。
来看你的代码,问题出在subfun()这行直接调用的方式:
var mainfun = function (){ function subfun(a){ this.k= 8 console.log(this.k) } subfun() // 这里直接调用,严格模式下this是undefined } mainfun()
下面给你几个可行的解决方法,按需选择:
- 让subfun的this指向mainfun的上下文:用
call或者apply显式绑定this
var mainfun = function (){ function subfun(a){ this.k= 8 console.log(this.k) } subfun.call(this) // 把mainfun的this传给subfun } mainfun()
- 不用this,直接用局部变量:如果只是需要存储一个值,没必要用this
var mainfun = function (){ let k = 8; function subfun(a){ console.log(k) } subfun() } mainfun()
- 把subfun作为构造函数调用:用
new关键字,此时this会指向subfun的实例对象
var mainfun = function (){ function subfun(a){ this.k= 8 console.log(this.k) } new subfun() } mainfun()
总结一下:核心是要搞清楚不同调用场景下this的指向规则,ES模块的严格模式是这次报错的关键,调整函数的调用方式或者变量的使用方式就能解决问题啦~
备注:内容来源于stack exchange,提问作者joren
相关产品推荐
相关产品推荐

