函數(也是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也一樣