函数(也是obj,但是有特殊之处)
1、区别与其他对象的一个核心特性:函数是可被调用的
Fun()
//所有object 使用的操作,function也适用
2、回调函数
//作为参数被传递到另一个函数,等待被调用
a=[1,2,3,4,5,-1,-2]
a.sort((a,b)=>{
returnb-a
})
console.log(a);
forEach(()=>{})//对每一个进行处理
利用属性实现带记忆的函数
3、参数
1)rest参数//只能是最后一个参数
let fun=(a ,b ,...q)=>{//定义的时候用…
return q[1]
}
ss = fun(1,2,3,4,5,6)
console.log( ss );
2)arguements//这是一个对象,有length等属性
如何将一个对象变为数组//传入的是一个对象,而不是数组
1)自己写函数//把每个数都取出来
2)Array.from(最佳方法)
let fun = function (a, b) {
let args=Array.from(arguments)
console.log(args)
}
fun(1, 2, 3, 4, 5, 6)
3)[].slice.call(arguments)
let fun = function (a, b) {
//let args=Array.from(arguments)
let args = [].slice.call(arguments)
console.log(args)
}
fun(1, 2, 3, 4, 5, 6)
奇怪特性,arguments是传入值,但是如果在函数中被改变,也会改变//相当于别名(可以用static 消除)
3)参数默认值
(a=0,b=1)//默认值放在后面
arguments总是记录实际传入的
let a=function (v1,v2=v1){
console.log(v1+v2)
}
a(3)
4)sprea操作符//将数组分解为一组元素后传入方法中
...(感觉没区别)
4、函数的四种调用
函数上下文(this访问,一个object或者undefined,作为隐式参数被传递)
作为函数被调用
作为方法被调用
作为构造函数被调用
通过apply或call方法被调用
1)作为函数被调用
函数声明//function a(){}
函数表达式// let a=function(){}
立即调用函数//(function(){})()
在static下:undefined(this无作用)
非 static :全局对象(有副作用)
2)作为方法被调用:(放一个对象的属性的值是函数时,称作是一个方法被调用)
则this是该对象(被调用时所在的object)
3)作为构造函数被调用
(构造函数的作用:更加方便的创建多个具有共性的object)
let fun = function (){
this.whoA = () => {
return this
}
}
let pa = new fun()
if (pa.whoA() == pa) {
console.log('dssssssssssssss')
}
如果没有new,则会表现出‘作为函数被调用’
new非常重要!!!!!!!!!!
****具有原子类型的返回的函数作为构造函数的时候,返回值被忽略,new创建的obj被返回
****具有obj类型的返回的函数作为构造函数的时候,返回值被返回,new创建的obj被忽略
函数的命名约定:构造函数----首字母大写
普通函数----首字母小写
如何判断有无加new
//es6新增
let fun = function () {
if (typeof new.target !== "undefined") {
}
else{
console.log('plseae add new')
}
this.whoA = () => {
return this
}
}
//更完美的一种方式
letfun = function () {
if (typeof new.target !=="undefined") {
}
else {
return new fun()
// console.log('plseae add new')
}
this.whoA = () => {
return this
}
}
4)通过apply或call方法被调用//一种和setprototypeOf(son,baba)一样的方法
baba.sayhello.call(son,a,b,c)
baba.sayhello.aplay(son,[a,b,c])
//第一个参数为函数调用的上下文
**技巧,apply,array
bind方法:
x.bind(son,...args)
//返回一个函数,行为与x完全相同,上下文被固定为son,永不能改变
***注意事项,箭头函数不能被作为构造函数(没有自己的new,target,没有this,arguments这两个参数,被调用时没有自己的函数上下文)
**箭头函数的this在被创建时确定,永不再变,arguements也一样