coldfusion - 在 ColdFusion 中,我可以按值捕获封闭变量吗?
问题描述
假设我们正在构建一个闭包列表,这些闭包对一个值执行某些功能,i
其中i
每次迭代都是一个新值。例如:
function foo() {
var result = [];
for (var i = 0; i < 4; i++) {
arrayAppend(result, function() { return i; });
}
return result;
}
flist = foo();
newline = "<br>";
for (f in flist) {
WriteOutput(f() & newline);
}
看来 CF 是i
通过引用捕获的——上面的结果是:
4
4
4
4
这些结果在 CF2011、CF2016、Lucee4.5 和 Lucee5 中是相同的(我通过 trycf.com 进行了测试,很方便,假设它确实在运行这些引擎)。
我已经实现了一种我称之为 a 的迂回方式value_capturing_closure
,但并不想把它强加给我的团队,因为最好坚持使用每个人都熟悉的 CF 习语。是否可以在 CF 中使用原生 CF 闭包语法按值捕获变量?
解决方案
这就是闭包的工作原理。您需要做的是导致值的副本发生,并将该副本绑定到未持久化的函数。这可以通过创建一个接受参数的函数然后创建一个函数来完成。
function foo() {
var result = [];
for (var i = 0; i < 4; i++) {
arrayAppend(result, function(x) {
return function(){ return x };
}(i));
}
return result;
}
或为了清楚起见而分离成一个单独的功能
function foo() {
var result = [];
for (var i = 0; i < 4; i++) {
arrayAppend(result, createClosure(i));
}
return result;
}
function createClosure(x) {
return function() {
return x;
}
}
推荐阅读
- amazon-web-services - 尝试使用无服务器创建 AWS Elasticsearch 集群。以状态码结束:409;错误代码:InvalidTypeException
- c++ - 需要在makefile中进行哪些更改才能启用自动矢量化的显示报告?
- telegram - 我怎么知道电报机器人是我的?
- oracle - Docker node-oracledb 镜像构建运行冲突 Oracle Instant Client 版本
- javascript - 嵌套路径不存在时,DynamoDB 更新失败
- scala - java.io.FileNotFoundException: s3:/my_bucket/input2.properties 同时使用 AWS EMR 通过 jar 从 S3 存储桶访问
- r - 在 R 中使用多个条件执行条件 Diff()
- erd - 电影院票务座位 ERD
- python - 需要在python中合并一个稀疏矩阵和数据框中的两列
- regex - 在某个字符串之后使用 sed 将 camelCase 转换为 snake_case?