为"传递参数的语法是什么?在Array.prototype中循环?

时间:2015-12-16 17:43:26

标签: javascript ecmascript-5

如果我有这样的代码:

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这次没有为我工作:/

4 个答案:

答案 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]

非常整洁。

DEMO