Dart汇总请点击这里
文章目录
-
-
-
- 词法作用域
- 变量查找规则
- 词法闭包
- 测试函数是否相等
-
-
Dart 是一门词法作用域的编程语言,就意味着变量的作用域是固定的, 简单说变量的作用域在编写代码的时候就已经确定了。 花括号内的是变量可见的作用域。
词法作用域
词法作用域就是作用域是由书写代码时函数声明的位置来决定的。编译阶段就能够知道全部标识符在哪里以及是如何声明的,所以词法作用域是静态的作用域,也就是词法作用域能够预测在执行代码的过程中如何查找标识符。
下面示例关于多个嵌套函数的变量作用域:
bool topLevel = true;void main() {
var insideMain = true;void myFunction() {
var insideFunction = true;void nestedFunction() {
var insideNestedFunction = true;assert(topLevel);assert(insideMain);assert(insideFunction);assert(insideNestedFunction);}}
}
注意 nestedFunction() 可以访问所有的变量, 一直到顶级作用域变量。
变量查找规则
在作用域中查找变量都是RHS,并且查找的规则是从当前作用域开始找,如果没找到再到父级作用域中找,一层层往外找,如果在全局作用域如果还没找到的话,就会报错了:
词法闭包
闭包 即一个函数对象,即使函数对象的调用在它原始作用域之外, 依然能够访问在它词法作用域内的变量。
函数可以封闭定义到它作用域内的变量。 接下来的示例中,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);
}