JavaScript模块模式问题:方法内this指向Window而非对象
为什么你的模块方法里
this会指向Window?来拆解一下 嘿,这个问题其实是JavaScript里this绑定规则的经典坑,我来一步步给你讲清楚:
先理清楚代码的执行流程
- 当你调用
Module.init()时,init方法内部调用了_helper.some()——这时候some函数里的this是指向_helper对象的,因为它是通过_helper.some()这种对象方法调用的形式执行的。 - 接下来在
some里执行了setTimeout(this.someCallback, 1000):这里你其实是把someCallback函数的引用传递给了setTimeout。1秒后,浏览器会在全局上下文里执行这个回调函数——这时候问题就来了。
核心原因:this的指向由调用方式决定
JavaScript中函数的this指向,从来不是看它定义在哪里,而是看它被怎么调用:
- 如果是通过
obj.fn()的形式调用,this指向obj; - 如果是直接调用函数(比如
fn(),或者像这里被setTimeout间接调用),在非严格模式下,this会默认绑定到全局对象(浏览器里就是Window)。
你的someCallback就是被setTimeout以“普通函数调用”的方式执行的,所以它内部的this自然指向了Window。
给你几个解决方法
方法1:用箭头函数继承外层this
箭头函数的this是继承自外层作用域的,不会自己绑定上下文。修改some函数:
some: function() { _private = setTimeout(() => { this.someCallback(); // 这里的this和some函数里的this一致,都是_helper }, 1000) }
或者直接把回调写成箭头函数:
some: function() { _private = setTimeout(() => { console.log(this); // 这里this指向_helper }, 1000) }
方法2:提前保存this到变量
在some函数里先把当前的this存下来,后续用这个变量访问:
some: function() { const self = this; // 这里的this是_helper _private = setTimeout(function() { self.someCallback(); // 用self代替this,确保指向_helper }, 1000) }
方法3:用bind强制绑定this
通过bind方法给someCallback绑定固定的this指向:
some: function() { _private = setTimeout(this.someCallback.bind(this), 1000) }
bind(this)会返回一个新函数,这个新函数的this永远绑定到当前的_helper对象,不管后续怎么调用它。
内容的提问来源于stack exchange,提问作者user1128677
相关产品推荐
相关产品推荐

