JavaScript立即执行函数表达式中this指向问题:两段代码为何结果不同?
两段代码执行结果差异的原因
第一段代码能正确返回1的逻辑
第一段代码里,立即执行函数内部用let test = 1声明了一个局部变量,内部函数getTest借助闭包特性,始终能访问到这个外部作用域的test变量。不管后续getTest以何种方式被调用,它都能读取到最初的test值1,所以test.getTest()会返回预期结果。
第二段代码失效的核心原因
第二段代码的问题出在this的指向逻辑上:
- 立即执行函数是普通函数调用模式,此时函数内部的
this默认绑定全局对象(浏览器环境为window,Node.js环境为global),所以this.test = 1其实是给全局对象添加了test属性,和最终返回的对象毫无关联。 - 当调用
test.getTest()时,getTest作为返回对象的方法被调用,此时它内部的this指向的是test这个对象,但该对象并没有test属性,因此返回undefined,达不到预期效果。
如果要修正第二段代码,可以用以下几种方式:
- 把
getTest改成箭头函数:箭头函数的this继承自外层作用域,能拿到立即执行函数里的this - 提前缓存
this:在立即执行函数里声明const self = this,getTest里返回self.test - 用
bind绑定this:返回{ getTest: getTest.bind(this) }
内容的提问来源于stack exchange,提问作者Vivek Kumar
相关产品推荐
相关产品推荐

