词法闭包
闭包 就是一个函数对象,就算函数对象的调用在它原始作用域之外, 依然可以访问在它词法作用域内的变量。
函数可以封闭定义到它作用域内的变量。 下面示例中, makeAdder() 捕获了变量 addBy。 不论何时执行返回函数,函数都会使用捕获的 addBy 变量。
/// 返回一个函数,返回的函数参数与 [addBy] 相加。
Function makeAdder(num addBy) {
return (num i) => addBy + i;
}
void main() {
// 创建一个加 2 的函数。
var add2 = makeAdder(2);
// 创建一个加 4 的函数。
var add4 = makeAdder(4);
assert(add2(3) == 5);
assert(add4(3) == 7);
}
测试函数是否相等
下面是顶级函数,静态方法和示例方法相等性的测试示例:
void foo() {} // 顶级函数
class A {
static void bar() {} // 静态方法
void baz() {} // 示例方法
}
void main() {
var x;
// 比较顶级函数。
x = foo;
assert(foo == x);
// 比较静态方法。
x = A.bar;
assert(A.bar == x);
// 比较实例方法。
var v = A(); // A的1号实例
var w = A(); // A的2号实例
var y = w;
x = w.baz;
// 两个闭包引用的同一实例(2号),
// 所以它们相等。
assert(y.baz == x);
// 两个闭包引用的非同一个实例,
// 所以它们不相等。
assert(v.baz != w.baz);
}