如何调用JS .apply()方法

时间:2016-08-18 04:29:19

标签: javascript

尽管我已就此咨询了所有书籍和博客,但我还没有完全理解如何调用js .apply(),这在改变函数上下文时非常重要。有时候我做对了,有时我做不到,签上一切都还不好。

function sumArr(arr){
var sum =0;
for(var i =0; i<arr.length; i++){
sum+= arr[i];
}
return sum
}
 var x = [3, 6, 8];
var obj ={
name: 'somebody',
scores:[3, 6, 8]
}
// console.log(sumArr(x)) outputs 17, fine!
// Now sumArr.apply(null, x) outputs 0
// Next, sumArr.apply(obj, obj.scores) outputs 0 
please could somebody tell me how to call this method correctly. 

2 个答案:

答案 0 :(得分:3)

.apply()方法用于将数组作为单个参数传递给函数,因此sumArr.apply(null, x)基本上等同于sumArr(3, 6, 8)

3没有长度属性,因此您的循环永远不会开始。

如果你想自己传递参数,你可以使用.call(),但不清楚你在这里尝试做什么。

function sumArr(arr) {
  var sum = 0;
  for (var i = 0; i < arr.length; i++) {
    sum += arr[i];
  }
  return sum
}

var x = [3, 6, 8];
var obj = {
  name: 'somebody',
  scores: [3, 6, 8]
}

console.log(sumArr.call(null, x));
console.log(sumArr.call(null, obj.scores));

答案 1 :(得分:1)

问题是.apply()从第二个参数传递的数组中取出元素,并将它们作为参数传递给函数,因此在.apply(null, [3,6,8])实际调用sumArr(3,6,8)中的方法的示例中}。所以传递参数的正确方法就像sumArr.apply(null, [[3,6,8]]。所以你的代码片段看起来像

function sumArr(arr){
    var sum =0;
    for(var i =0; i<arr.length; i++){
        sum+= arr[i];
    }
    return sum
}
var x = [3, 6, 8];
var obj ={
    name: 'somebody',
    scores:[3, 6, 8]
}
console.log(sumArr(x));
//.apply() takes each array elment and passes it as a parameter
console.log(sumArr.apply(null, [x]));
console.log(sumArr.apply(obj, [obj.scores]));

希望这有帮助。