const obj = {
name:"222",
test(){
return this.name
}
}
console.log((obj.test)())
结果为222
const obj = {
name:"222",
test(){
return this.name
}
}
console.log((obj && obj.test)())
结果为空值,
想问一下这两个有什么不一样吗,感觉都是先获取到obj.test,而且obj.test是用括号包起来的,然后调用一下,但是两个结果的obj.test调用的结果却是不一眼的,第一个this是obj,第二个是window感觉.
不是很清楚,希望可以得到解惑
其实可以从 AST 的角度去理解,调用表达式被称为
CallExpression
它具有两个子节点,在线查看 AST
callee
被调用函数arguments
函数参数(obj.test)()
的 callee 是 MemberExpression(obj && obj.test)()
的 callee 是一个 LogicalExpression当 callee 是 MemberExpression 时,MemberExpression 的 object 也是就
obj
会作为这个 CallExpression 的 this 传递进去,这就是我们熟知的 this 概念