尽管我已就此咨询了所有书籍和博客,但我还没有完全理解如何调用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.
答案 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]));
希望这有帮助。