请求解释Dart闭包代码运行逻辑:为何始终保留BMW值?
理解Dart闭包为何始终保留BMW的原因
核心原因是闭包会捕获创建时所在词法作用域的变量引用,每次调用makeCar都会生成独立的作用域与绑定的闭包,下面逐行拆解代码执行逻辑:
代码执行过程分析
1. 创建绑定BMW的闭包
var car = makeCar('BMW');
调用makeCar('BMW')时:
- 进入
makeCar的新作用域,参数make被赋值为'BMW',局部变量ingane设为'4.4'。 - 返回的匿名函数(闭包)会捕获当前作用域中
make和ingane变量的引用,而非复制值。 - 变量
car指向这个绑定了make='BMW'的闭包,只要car存在,闭包就会一直持有该引用。
2. 打印函数与闭包对象
print(makeCar); // 输出 Closure 'makeCar' print(car); // 输出 Closure 'makeCar_closure'
makeCar是函数本身,打印的是函数对象。car是makeCar('BMW')返回的闭包实例,打印闭包对象。
3. 创建Tesla闭包但未保存
print(makeCar('Tesla')); // 输出 Closure 'makeCar_closure'
调用makeCar('Tesla')会生成一个绑定make='Tesla'的新闭包,但你仅打印了闭包对象,未将其赋值给变量保存,后续无法调用该闭包输出Tesla相关结果。
4. 调用绑定BMW的闭包
print(car('Audi')); // 输出 Audi,4.4,BMW print(car('Nissan')); // 输出 Nissan,4.4,BMW print(car('Toyota')); // 输出 Toyota,4.4,BMW
每次调用car,都是执行之前绑定make='BMW'的闭包。由于闭包持有创建时作用域中make变量的引用,无论传入什么model参数,make的值始终是BMW,ingane也保持为'4.4'。
澄清词法闭包的核心逻辑
词法闭包的关键是:闭包会记住它创建时所在的词法作用域,并且持有该作用域内变量的引用,即使闭包被带到原作用域外执行,依然能访问这些变量的当前值。
比如修改代码保存多个闭包:
void main() { var carBMW = makeCar('BMW'); var carTesla = makeCar('Tesla'); print(carBMW('X5')); // 输出 X5,4.4,BMW print(carTesla('Model 3'));// 输出 Model 3,4.4,Tesla }
此时carBMW和carTesla是两个独立闭包,分别绑定各自作用域的make变量,调用时会输出对应品牌。
内容的提问来源于stack exchange,提问作者DenisNos
相关产品推荐
相关产品推荐

