回调函数
回调函数是一段可执行的代码段,它作为一个参数传递给其他的代码,其作用是在需要的时候方便调用这段(回调函数)代码。
在JavaScript中函数也是对象的一种,同样对象可以作为参数传递给函数,因此函数也可以作为参数传递给另外一个函数,这个作为参数的函数就是回调函数。
this的使用
注意在回调函数调用时this的执行上下文并不是回调函数定义时的那个上下文,而是调用它的函数所在的上下文。
var obj = {
sum: 0,
add: function(num1, num2){
this.sum = num1 + num2;
}
};
function add(num1, num2, callback){
callback(num1, num2);
};
add(1,2, obj.add);
console.log(obj.sum); //=>0
console.log(window.sum); //=>3
上述代码调用回调函数的时候是在全局环境下,因此this指向的是window
,所以sum
的值是赋值给windows
的。
关于this
执行上下文的问题可以通过apply
方法解决。
var obj = {
sum: 0,
add: function(num1, num2){
this.sum = num1 + num2;
}
};
function add(num1, num2, callbackObj, callback){
callback.apply(callbackObj, [ num1, num2 ]);
};
add(1,2, obj, obj.add);
console.log(obj.sum); //=>3
console.log(window.sum); //=>undefined
闭包
闭包函数:声明在一个函数中的函数,叫做闭包函数。
闭包:内部函数总是可以访问其所在的外部函数中声明的参数和变量,即使在其外部函数被返回(寿命终结)了之后。
Vue reduce函数
语法
arr.reduce(callback,[initialValue])
reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(或者上一次回调函数的返回值),当前元素值,当前索引,调用 reduce 的数组。
callback (执行数组中每个值的函数,包含四个参数) 1、previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue)) 2、currentValue (数组中当前被处理的元素) 3、index (当前元素在数组中的索引) 4、array (调用 reduce 的数组) initialValue (作为第一次调用 callback 的第一个参数。)
将多维数组转化为一维
//递归写法
let arr = [
[0, 1],
[2, 3],
[4, [5, 6, 7], [8, 9, 10]],
];
const newArr = (arr) => {
return arr.reduce(
(pre, cur) => pre.concat(Array.isArray(cur) ? newArr(cur) : cur),
// ?此时的cur为[5, 6, 7],返回后重组到pre里面,此处的三元运算符为递归终止
[]
);
};
console.log(newArr(arr)); //[0, 1, 2, 3, 4, 5, 6, 7]
let oldArr = arr.reduce((pre,cur)=>{
return pre.concat(cur)
},[])
console.log(oldArr); // [0, 1, 2, 3, 4, 5]
参考:
vue reduce函数的用法 – 幽冥狂_七 – 博客园 (cnblogs.com)
JavaScript回调函数 – CNode技术社区 (cnodejs.org)
闭包,看这一篇就够了——带你看透闭包的本质,百发百中_羊二哥的博客-CSDN博客_闭包
什么是闭包?闭包的优缺点? – cc_ccc – 博客园 (cnblogs.com)
箭头函数 – JavaScript | MDN (mozilla.org)