function myConcat(separator) {
var result = ''; // 拼接结果字符串
var i;
// iterate through arguments
for (i = 1; i < arguments.length; i++) {
result += arguments[i] + separator;
}
return result;
}
剩余参数语法允许将不确定数量的参数转化表示为数组
下面这个例子中将第二个到最后一个参数组成数组theArgs
function multiply(multiplier, ...theArgs) {
return theArgs.map(x => multiplier * x);
}
var arr = multiply(2, 1, 2, 3);
console.log(arr);//输出:[2,4,6]
var arr=[1,2,3]
var arr_double1=arr.map(function(item){
return item*2
})
var arr_double2=arr.map(item=>item*2)
在普通的闭包函数中
function testThis(){
let data=10
setTimeout(function(){
console.log("this.data:",data)
},1000)
}
testThis()
变成构造函数中
1.在内部函数使用this,其指向的是内部函数作用域,则输出为undefined
function testThis(){
this.data=10
setTimeout(function(){//严格模式下this指向内部函数
console.log("this.data:",this.data)
},1000)
}
let newThis=new testThis()
2.如果要把this传递到内部函数,可以定义一个变量指向this,内部函数直接可以访问该变量(嵌套函数的特点),进而获取到this的属性值。
function testThis(){
this.data=10
var thisvar=this
setTimeout(function(){
console.log("this.data:",thisvar.data)
},1000)
}
let newThis=new testThis()
普通闭包函数换成箭头函数
箭头函数的this指向的是外部函数的this
function testThis(){
this.data=10
setTimeout(()=>{
console.log("this.data:",this.data)
},1000)
}
let newThis=new testThis()
(1)由于箭头函数没有自己的this指针,通过 call() 或 apply() 方法调用一个箭头函数时,只能传递参数,他们的第一个参数会被忽略。
代码示例
var addStruct={
sum:0,
add(addnum){
var addfunc=(addnum)=>addnum+this.sum
return addfunc(addnum)//返回的是addnum+this.sum
},
addBycall(addnum){
var addfunc=(addnum)=>addnum+this.sum
return addfunc.call(null,addnum)//第一个参数会被忽略
}
}
执行结果
(2)当箭头函数作为方法被定义时
var addStruct={
sum:0,
add(addnum){
var addfunc=(addnum)=>addnum+this.sum
return addfunc(addnum)//返回的是addnum+this.sum
},
addBycall(addnum){
var addfunc=(addnum)=>addnum+this.sum
return addfunc.call(null,addnum)//第一个参数会被忽略
},
arrowfunc:()=>{
console.log("this.sum:",this.sum)
}
}
(3)箭头函数不能作为构造器
(4)箭头函数不能用作函数生成器
(5)箭头函数同样支持参数列表和参数解构
参数列表和参数解构
function sum([a,b,c]=[1,2,3],{x:d}={x:10}){
console.log("a+b+c+d:",a+b+c+d)
}
var arrowSum=([a,b,c]=[1,2,3],{x:d}={x:10})=>{
console.log("a+b+c+d:",a+b+c+d)
}
var arrowSum=({x:d}={},[a,b,c]=[1,2,3])=>{
console.log("a+b+c+d:",a+b+c+d)
}
可以直接使用属性值来计算
var arrowSum=({x},[a,b,c]=[1,2,3])=>{
console.log("a+b+c+d:",a+b+c+x)
}
(6)箭头函数返回对象字面量时
需要用圆括号把对象字面量包裹起来,防止误认为是函数块体,当为函数块体时,必须要有return返回值
(7)立即执行函数
(()=>'immediate function')()
(8)箭头函数在一些函数或方法体内部使用非常常见
(9)箭头函数可以闭包
function OutFunc(){//标准闭包
var i=0;
return function addfunc(){
return (++i);
};
};
function ArrowFunc(){//箭头函数闭包
var i=0;
return (()=>{
return (++i);
});
};
(10)箭头函数的递归
var cumulate=(x)=>(x==1?1:x+cumulate(x-1))