如果我有这样的代码:
QB_list.x.forEach(pushElementsQB)
function pushElementsQB(element, index, array)
{
rows.push([element, QB_list.y[index], "QB: " + QB_list.text[index], null, null, null, null]);
}
有没有办法在回调中指定rows变量?我是javascript的新用户,看看spec这次没有为我工作:/
答案 0 :(得分:3)
为什么不使用map
?
var rows = QB_list.x.map(pushElementsQB);
function pushElementsQB(element, index, array)
{
return [element, QB_list.y[index], "QB: " + QB_list.text[index], null, null, null, null];
}
map
基本上是forEach
,返回Array
。
答案 1 :(得分:1)
正如@Grundy所提到的,一种方法是在函数内设置bind的值:
QB_list.x.forEach(pushElementsQB.bind(rows))
function pushElementsQB(element, index, array) // here this will be rows
{
this.push([element, QB_list.y[index], "QB: " + QB_list.text[index], null, null, null, null]);
}
与设置forEach的第二个参数相同:
QB_list.x.forEach(pushElementsQB, rows)
另一种方法是将行添加为额外参数:
QB_list.x.forEach(pushElementsQB.bind(QB_list.x.forEach.args,rows))
然后使用:
function pushElementsQB(rows, element, index, array) // be careful, rows is the first parameter now
{
rows.push([element, QB_list.y[index], "QB: " + QB_list.text[index], null, null, null, null]);
}
答案 2 :(得分:1)
对于这个用例,@ Mathletics对Map
的回答最好,但要回答这个问题,并继续@juvian和@Grundy的回复。您可以使用Bind绑定上下文(this
关键字)。但是,这很有用,因为你使该函数接受上下文,并且那些参数永远,并且在所有其他用法中直到未绑定。
您可以采用更简单,更安全,后来更具期待性的方式执行此操作,如下所示。
Array.forEach的第二个参数是thisArg
。给出这些行,它就可以在不使用bind的情况下完成相同的操作。
var rows = []; // Declare rows variable
QB_list.x.forEach(pushElementsQB, rows) // Pass it in for the callbacks context
function pushElementsQB(element, index, array) {
this.push([element, QB_list.y[index], "QB: " + QB_list.text[index], null, null, null, null]);
}
如果您真的想将变量强加给参数,可以这样做:
var rows = []; // Declare rows variable
QB_list.x.forEach(function() {
pushElementsQB.apply(
QB_list.x, // Set the function to be called with list as context (`this`)
arguments.concat([rows]) // Grab the arguments to this function, append rows, set the function to be called with that appended list
)
})
function pushElementsQB(element, index, array, rows) {
// Rows is appended to the end of the arguments list, so, maps to 'rows' argument here
rows.push([element, QB_list.y[index], "QB: " + QB_list.text[index], null, null, null, null]);
}
答案 3 :(得分:1)
map
,由Mathletics建议是一个不错的选择。使用它的另一个好理由是你可以传入一个在回调中充当this
的初始参数。例如,如果已经声明rows
并且您想要向其推送更多数据,则可以执行以下操作:
var data = { x: [1, 2, 3, 4] };
var rows = [2];
// pass in `rows` as the initial argument
data.x.map(pushElementsQB, rows);
function pushElementsQB(el) {
// `this` is `rows`, and `map` appends the elements
// from data.x to it.
return this.push(el);
}
console.log(rows); // [2, 1, 2, 3, 4]
非常整洁。