我们可以将匿名函数分配给变量,然后可以根据需要检索或访问闭包的值。
匿名函数包含一个独立的代码块,可以在我们的代码中作为函数参数来传递。语法如下。
(parameter_list) { statement(s) }
让我们考虑以下例子。
void main() { var list = ["James","Patrick","Mathew","Learnfk"]; print("Example of anonymous function"); list.forEach((item) { print('${list.indexOf(item)}: $item'); }); }
输出:
Example of anonymous function 0: James 1: Patrick 2: Mathew 3: Learnfk
在上面的示例中,我们定义了一个带有untype参数项的匿名函数。该函数为列表中的每个项目调用,并使用指定的索引值打印字符串。
如果函数由一个语句组成,那么我们还可以通过以下方式编写以上代码。
list.forEach( (item) => print("${list.indexOf(item)}: $item"));
正如我们在Dart简介中所讨论的那样,它是一种词法作用域语言,这意味着变量的作用域是在编译时确定的。变量的范围是在编译代码时确定的。如果变量在不同的花括号中定义,则其行为将有所不同。让我们了解以下示例。
bool topVariable = true; void main() { var inside_Main = true; //定义嵌套函数 void myFunction() { var inside_Function = true; void nestedFunction() { var inside_NestedFunction = true; //该函数正在使用以前函数的所有变量。 assert(topVariable); assert(inside_Main); assert(inside_Function); assert(inside_NestedFunction); } } }
词法闭包称为闭包,是一个函数对象,即使在原始范围内使用该函数,也可以在其词法范围内访问变量。换句话说,它提供了从内部函数访问外部函数范围的权限。让我们了解以下示例。
void main() { String initial() { var name = 'Will Smith';//名称是由init创建的局部变量 void disp_Name() {//displayName()是内部函数,一个闭包 print(name);//使用在父函数中声明的变量 } disp_Name(); } init();
输出
Will Smith
在上面的代码中, initial()函数创建了一个名为 name 和函数的局部变量,称为 disp_Name()。 disp_Name()函数在 initial()函数中定义,因此 disp_Name()函数没有本地变量。
内部函数可以访问外部函数的变量。函数disp_Name()可以访问在外部函数中声明的名称变量 initial()。
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)