函数调用的表达式是 CallExpression : MemberExpression Arguments
Arguments 就是函数后面的那个括号, MemberExpression 就是括号前面的东西
例如 (foo.bar)(1) MemberExpression 是 (foo.bar), Arguments 是 (1)
函数调用时,执行如下过程(以下记为 过程 a)
```
1 令 ref 为执行 MemberExpression 的结果
2 令 func 为调用 GetValue(ref)的结果
3 令 argList 为执行 Arguments 的结果
4 如果 func 不是 Object,抛出 TypeError
5 如果 func 没有内部属性[[call]],抛出 TypeError
6 如果 ref 是 Reference
a 如果 ref 的基值是 Boolean String Number Object //作为属性调用 // Es6 新增 Symbol
i 令 thisValue 为调用 GetBase(ref)的结果
否则, ref 的基值是环境记录 //作为变量调用
i 令 thisValue 为调用 GetBase(ref). ImplicitThisValue 的结果 // ImplicitThisValue 通常返回 undefined,除非 provideThis 值为 true(with 语句)
否则,ref 不是 Reference
令 thisValue 为 undefined // 进入函数时, thisVaule 为 undefined 会让 this 指向 window 全局对象
8 return func.[[call]](thisValue, argList)
```
函数本质上就是个 Object,有个内部方法[[call]],调用函数,本质上就是调用函数的内部方法[[call]]
```
F.[[call]](thisValue ,argList)
```
这个 thisValue 就是 this 值[在进入执行环境时,如果 thisValue 为 undefind, 则令 this 为 Global Object(浏览器里就是 window)]
所以过程 a 的执行过程就是先运行 MemberExpression,然后判断返回值.如果不是 Reference 类型, 令 thisValue 为 undefined
---
另外解释下什么是 Reference
js5 的类型有 Number Object Function null undefined String Boolean Reference
这个 Reference 是个虚假的概念,实际上不存在.作用是用来描述 delete 等操作,Reference 由 3 部分组成 base value referenced name strict reference flag
例如 foo.bar 返回的是个 Reference 结构如下
```
{
baseValue: bar,
referenced name: 'foo'
strict: false
}
```
再举个例子 function() {var foo = 1; var bar = 2}
这里的 foo 也返回一个 Reference
```
{
baseValue: {foo:1, bar: 2} <-- 这个可以理解为所谓的作用域
referenced name: 'foo'
strict: false
}
```
---
有没有 this 取决于 MemberExpression,那么,(foo.bar)返回的是什么?
()是群组运算符, 表达式为 PrimaryExpression : ( Expression )
运行过程是
```
返回执行 Expression 的结果。这可能是一个 Reference。
```
https://www.w3.org/html/ig/zh/wiki/ES5/%E8%A1%A8%E8%BE%BE%E5%BC%8F#.E7.BE.A4.E7.BB.84.E8.BF.90.E7.AE.97.E7.AC.A6也就是返回什么取决于括号里边的 Expression (foo.bar)就是 foo.bar , (false || foo.bar)就是 false|| foo.bar
||操作的定义在
https://www.w3.org/html/ig/zh/wiki/ES5/%E8%A1%A8%E8%BE%BE%E5%BC%8F#.E4.BA.8C.E5.85.83.E9.80.BB.E8.BE.91.E8.BF.90.E7.AE.97.E7.AC.A6注意第 5 步返回的是 GetValue(rref),不是 Reference.