为何该逻辑表达式返回全局对象?控制台输出Window对象疑问
为什么这段逻辑表达式会返回全局对象?
这个问题问得很到位!咱们来一步步拆解这段代码,看看它在浏览器里为啥会返回Window对象~
首先先把代码贴出来方便分析:
var root = (typeof self == 'object' && self.self === self && self) || (typeof global == 'object' && global.global === global && global); console.log(root); // 浏览器中输出Window对象
核心逻辑:利用||的短路特性
JavaScript里的逻辑或||是短路求值的——从左到右依次判断,只要左边的表达式能返回“真值”,就直接返回左边的值,不会再执行右边的代码。这段代码就是靠这个特性,优先尝试获取浏览器环境的全局对象,失败了再去拿Node.js环境的全局对象。
拆解左边的self判断分支
在浏览器环境里,这个分支会先被触发:
typeof self == 'object':浏览器里的self是全局Window对象的一个引用,它的类型确实是object,这个条件成立。self.self === self:全局对象的self属性指向它自己(Window.self就是Window),所以这个全等判断也成立。- 逻辑与
&&也是短路求值,当前面两个条件都为真时,会返回最后一个操作数——也就是self,也就是Window对象。
因为左边已经返回了一个“真值”(Window对象在布尔判断里是真),所以||直接把这个值赋值给root,右边的global分支根本不会被执行。
为什么要加self.self === self?
这是个很巧妙的校验!它能过滤掉那些名字叫self但不是全局对象的情况——比如你在某个函数里定义了一个局部变量var self = {},这个self的self属性是undefined,肯定不等于自身,这样就能确保我们拿到的是真正的全局对象,而不是同名的局部变量。
补充:Node.js环境的情况
如果在Node.js里运行这段代码,self是不存在的,左边的分支会返回false,这时候就会执行右边的global分支:判断global是对象,且global.global === global(Node的全局对象global的global属性指向自身),最后返回global对象。
内容的提问来源于stack exchange,提问作者Salman Sarray
相关产品推荐
相关产品推荐

