当前位置: 代码迷 >> 综合 >> Dart —— 词法作用域 词法闭包
  详细解决方案

Dart —— 词法作用域 词法闭包

热度:7   发布时间:2023-12-10 22:01:24.0

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);
}