2.4.方法调用
AVM2调用方法时,第一个参数总是this,后跟声明的参数。当调用[[Call]]属性时,不同的闭包行为表现不同。闭包是包含方法引用的对象,[[Call]]属性根据闭包的不同类型(函数/function, 方法/method,类闭包/class closure)行为不同。
- 函数闭包是中全局方法,没有与任一类的实例关联。
- 方法闭包包含类的实例方法,并总会记住原始的
this值。
function f() {}
var a = f; // a是函数闭包
class C {
function m() {}
}
var q = new C();
var a = q.m; //a是函数闭包
如果是函数闭包,传递给[[Call]]的第一个参数被当做this传递给方法,如果第一个参数是null或undefined,全局对象将会被用作this。
如果是方法闭包,传递给[[Call]]的第一个参数将被忽略,闭包所保存的this将被传递给method作为第一个参数。
如果是类闭包,除了this外,还有一个参数被传递给[[Call]],这个调用被当做类型转换(type convention),这个参数将被转换为闭包所表示的类型。