gpt4 book ai didi

javascript - 重构: Anonymous functions to named functions,参数引用

转载 作者:行者123 更新时间:2023-12-02 15:45:23 25 4
gpt4 key购买 nike

所以我遇到了一些困境,试图在 Javascript 中重构一组嵌套的匿名闭包。但是我不确定维护对参数的引用的标准方法,否则子闭包会看到这些参数。

例如

var foo;
var obj = new Obj();
obj.foobar(function (p1, p2, p3) {
foo.onEvent(function (s1, s2) {
if (s1 === 'bar') {
s2.status = p2; //p2 has a reference here
}
});
});

但是,如果我重构这段代码,那么每个闭包都在它自己的命名函数上,那么获取 p2 引用的理想方法是什么?

示例

var onFooEvent = function (s1, s2) {
if (s1 === 'bar') {
s2.status = p2; //p2 will no longer has a reference here
}
};

var onFoobar = function (p1, p2, p3) {
foo.onEvent(onFooEvent);
};

var foo;
var obj = new Obj();
obj.foobar(onFoobar);

更可靠的示例

var pooledQuery = function (query, params, env, res) {
return new imports.promise(function(resolve, reject) {
pool.acquire(function (err, client) {
var db;
if (err != null) {
console.log(err)
reject(err);
}
var meta = { env: env, res: res, result: [] };

db = client.query(query, params);
db.on('result', function (res) {
return res.on('row', function (row) {
return meta.result.push(row);
}).on('error', function (err) {
meta.result = err;
reject(meta);
}).on('end', function (info) {
return meta.result;
});
}).on('end', function () {
pool.release(client);
resolve(meta);
});
});
});
};

最佳答案

将柯里化(Currying)函数传递给 foo.onEvent(并另外更改 onFooEvent 接受的参数)——如下所示:

var onFooEvent = function (pArgs, s1, s2) {
if (s1 === 'bar') {
s2.status = pArgs[1];
}
};

var onFoobar = function (p1, p2, p3) {
foo.onEvent(_.curry(onFooEvent)(arguments));
};

这是一个人为的可运行示例:

var _ = require('lodash')

var print_stuff = function (p_args, s1, s2) {
console.log(p_args[0])
console.log(p_args[1])
console.log(p_args[2])
console.log(s1)
console.log(s2)
}

var do_theoretical_stuff = function (p1, p2, p3) {
return _.curry(print_stuff)(arguments)
}

var do_actual_stuff = do_theoretical_stuff(1, 2, 3)

do_actual_stuff('a', 'b')

输出到控制台:

1
2
3
a
b

更新:下面关于bind的观点非常重要。 bind_.curry 之间的区别在于,使用 bind 时,您必须在使用它时设置上下文(通过第一个参数)。基本上,bind 会为您做两件事:1)设置上下文(即,显式绑定(bind)/定义 this 现在实际位于函数内部,而不是调用函数时) 2)做 curry 所做的事情。如果您不需要或想要第一个功能,那么我认为更干净的方法是使用 curry。 (如果您通常不使用像 lodash 这样的库,很容易找到一个可以添加到本地实用程序中的独立 curry 函数。)这个问题有更多关于该主题的内容:Javascript 's bind vs curry?

关于javascript - 重构: Anonymous functions to named functions,参数引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32239728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com