为何function(){}.__proto__ === Function.prototype与反向比较结果不同?
为什么两个看似一致的表达式结果截然不同?
这个问题本质是JavaScript语法解析器对函数声明和函数表达式的上下文识别逻辑导致的,属于很典型的语法陷阱!
1. 第一个表达式:Function.prototype === function(){}.__proto__ 正常返回true
在这个场景里,function(){}处于表达式上下文——它是===运算符的右侧操作数,引擎会自动把它识别为匿名函数表达式,也就是一个可以直接创建的函数实例。
我们都知道,所有函数实例的__proto__属性都会指向Function.prototype(因为函数本身就是Function构造函数的实例),所以这个比较自然会返回true。
2. 第二个表达式:function(){}.__proto__ === Function.prototype 触发语法错误
这里的function(){}处于语句上下文——它是代码的起始部分,引擎会默认把它识别为函数声明。而JavaScript的语法规则明确要求:函数声明必须指定函数名,不能是匿名形式。
所以引擎还没来得及执行后面的.__proto__和比较逻辑,就直接抛出了Uncaught SyntaxError: Function statements require a function name的语法错误。
如何让第二个表达式正常执行?
只要把function(){}强制切换到表达式上下文即可,最常用的方式是给它包裹一对括号:
(function(){}).__proto__ === Function.prototype // 此时会正常返回true
括号会明确告诉引擎:这是一个表达式而非函数声明,这样就能正常创建匿名函数并访问它的__proto__属性了。
内容的提问来源于stack exchange,提问作者microbingbing
相关产品推荐
相关产品推荐

