IIFE作为对象属性时this指向问题及对象未定义属性返回值疑问
两个JavaScript常见问题的拆解
1. 为啥a.check输出空字符串,不是预期的"Rhona"?
先看你给出的代码:
var a={ name:"Rhona", check:(function(){ return this.name; })(); } console.log(a.check) // 输出空字符串
核心问题出在立即执行函数(IIFE)的this指向上。当你在对象字面量里定义check时,右边的匿名函数是立即执行的——这时候对象a还没完成创建呢!所以这个IIFE执行时,this并不指向a。在非严格模式下,全局作用域里的this指向全局对象(浏览器里是window,Node.js里是global),而浏览器的window.name默认就是空字符串,所以这个函数返回的是空串,最后赋值给了a.check。
如果想拿到"Rhona",有两种简单改法:
- 把
check改成普通方法,去掉立即执行:check:function(){ return this.name; },之后调用a.check()就能得到正确结果(此时this指向a); - 要是非得用立即执行函数,得提前把
name的值传进去,比如check:(function(name){ return name; })("Rhona"),不过这样就失去了和对象的绑定关系,不如第一种方法实用。
2. 访问对象不存在的属性为啥返回undefined,不是“not defined”?
首先得搞清楚undefined和“not defined”的区别:
- 当你访问一个完全没声明过的变量时,JS会抛出
ReferenceError: xxx is not defined——因为这个变量在任何作用域里都没注册过,引擎根本不知道它是什么。 - 但对象属性的规则不一样:JS里的对象是动态的键值对集合,允许随时添加新属性。当你访问一个不存在的属性时,引擎不会报错,而是返回
undefined——这个值就是JS用来表示“当前没有对应值”的原始类型。
你提到变量创建阶段会被赋undefined,其实对象属性的逻辑是相通的:不存在的属性就相当于“这个键暂时没有值”,用undefined来标记是最合理的。如果返回字符串“not defined”,反而会把“无值”和“错误提示”混在一起,而且会破坏JS的灵活性——比如我们经常会用if (a.lastname)来判断属性是否存在,用undefined判断非常自然。
内容的提问来源于stack exchange,提问作者Mohan Pierce
相关产品推荐
相关产品推荐

