gpt4 book ai didi

javascript - 如何在不使用参数的情况下创建 javascript 函数的实例

转载 作者:行者123 更新时间:2023-11-28 15:38:31 27 4
gpt4 key购买 nike

我正在使用某些软件的 JavaScript API。在软件中,有解决方案,它们包含工作列表。

对于每个解决方案,我想列出工作列表。

solutions = obtainSolutionsformAPI();
for (i=0,i<solutions.length,i++){
sol=solutions[i];
sol.obtainWorklists(callbackFunction);
}

回调函数由软件调用,工作列表数组作为参数传递。

function callbackFunction(arrayOfWorkLists){
for (j=0,j<arrayOfWorkLists.length,j++){
wl=arrayOfWorkLists[j];
console.log(wl);
}
}

现在在 console.log 中,我还想打印出每个工作列表的 i 变量(解决方案的数量),但是如何获取 i在回调函数内部,当我不是调用它的人时?我怀疑每次将回调函数传递给 sol.obtainWorklists(callbackFunction); 之前都需要修改它,正确的方法是什么?

编辑:我不希望函数定义被嵌套(一个嵌套另一个),因为我有多个像这样的嵌套,并且它会非常难以阅读。所以我不想要这个:

sol.obtainWorklists(function callbackFunction(arrayOfWorkLists){...}); 

最佳答案

您可以使用构建器函数:

sol.obtainWorklists(buildCallback(i, callbackFunction));

...哪里buildCallback看起来像这样:

function buildCallback(index, func) {
return function() {
var args = [index];
args.push.apply(args, arguments);
func.apply(this, args);
};
}

下面的完整示例

然后在回调中,期待 i value 作为第一个参数,参数为 obtainWorklists通常会提供以下内容。

它是如何工作的:

  • 当您调用buildCallback ,您传入 i value 和您想要调用的回调。
  • buildCallback返回一个绑定(bind)了该信息的新函数(它是对 index 调用中 funcbuildCallback 参数的闭包)。
  • 何时 obtainWorklists调用函数buildCallback创建后,我们创建一个数组 i值 ( index ) 后跟从 obtainWorklists 接收的参数.
  • 然后我们使用相同的 this 调用回调。调用函数时使用的值,以及 args大批;您的回调将看到 args 中的条目作为离散参数。

如果你不关心this回调中的值,您可以使用 ES5 的 Function#bind相反:

sol.obtainWorklists(callbackFunction.bind(null, i));

它的作用大致相同,但不保留 this以前这样调用它。

<小时/>

构建器函数的完整示例 ( live copy ):

// obtainWorklists stand-in
function obtainWorklists(func) {
setTimeout(function() {
// Just call it with a random number
func(rand(100, 200));
}, rand(100, 500));
}

// Code to get worklists
var i;
for (i = 0; i < 10; ++i) {
obtainWorklists(buildCallback(i, callback));
}

function buildCallback(index, func) {
return function() {
var args = [index];
args.push.apply(args, arguments);
func.apply(this, args);
};
}


// Your callback
function callback(index, value) {
display("Index is " + index + ", value is " + value);
}

// ========= Utility functions
function rand(min, max) {
return Math.floor(Math.random() * (max - min)) + min;
}
function display(msg) {
var p = document.createElement('p');
p.innerHTML = String(msg);
document.body.appendChild(p);
}
<小时/>

Function#bind 的完整示例(live copy):

// obtainWorklists stand-in
function obtainWorklists(func) {
setTimeout(function() {
// Just call it with a random number
func(rand(100, 200));
}, rand(100, 500));
}

// Code to get worklists
var i;
for (i = 0; i < 10; ++i) {
obtainWorklists(callback.bind(null, i));
}

// Your callback
function callback(index, value) {
display("Index is " + index + ", value is " + value);
}

// ========= Utility functions
function rand(min, max) {
return Math.floor(Math.random() * (max - min)) + min;
}
function display(msg) {
var p = document.createElement('p');
p.innerHTML = String(msg);
document.body.appendChild(p);
}

关于javascript - 如何在不使用参数的情况下创建 javascript 函数的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24752504/

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