词法闭包
闭包
即一个函数对象,即使函数对象的调用在它原始作用域之外,依然能够访问在它词法作用域内的变量。
函数可以封闭定义到它作用域内的变量。接下来的示例中,函数 makeAdder()
捕获了变量 addBy
。无论函数在什么时候返回,它都可以使用捕获的addBy
变量。
/// 返回一个将 [addBy] 添加到该函数参数的函数。
/// Returns a function that adds [addBy] to the
/// function's argument.
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);
}
支持多个括号的连续调用:
Function generateFunc(int i){
return (item)=> item+i;
}
var func = generateFunc(100);
print(generateFunc(100)(10000));
测试函数是否相等
函数既然是对象,也可以比较是否相等:
void foo() {} // 定义顶层函数 (A top-level function)
class A {
static void bar() {} // 定义静态方法
void baz() {} // 定义实例方法
}
void main() {
var x;
// 比较顶层函数是否相等。
x = foo;
assert(foo == x);//true
// 比较静态方法是否相等。
x = A.bar;
assert(A.bar == x);//true
// 比较实例方法是否相等。
var v = A(); // A 的实例 #1
var w = A(); // A 的实例 #2
var y = w;
x = w.baz;
// 这两个闭包引用了相同的实例对象,因此它们相等。
assert(y.baz == x);//true
// 这两个闭包引用了不同的实例对象,因此它们不相等。
assert(v.baz != w.baz);//true
}
返回值
所有的函数都有返回值。没有显示返回语句的函数最后一行默认为执行 return null。
foo() {}
assert(foo() == null);
网友评论