1. 匿名函數(shù)
- 一個(gè)函數(shù)只使用一次時(shí),都必須用匿名函數(shù)
(function(形參列表){
})(實(shí)參列表); // 標(biāo)準(zhǔn)寫法浦译,分號(hào)最好寫上
+function(){}() // 這兩種寫法也可以
!function(){}()
- 函數(shù)提升
say(); // 報(bào)錯(cuò) 匿名函數(shù)沒有函數(shù)提升
let say = function () {
console.log('hello');
};
show(); // 正常運(yùn)行 具名函數(shù)有函數(shù)提升
function show() {
console.log('world');
};
2. 特殊參數(shù)
- 每個(gè)函數(shù)都有一個(gè)Arguments對(duì)象實(shí)例arguments掘宪,它引用著函數(shù)的實(shí)參
function show() {
console.log(arguments) // [Arguments] { '0': 1, '1': 2, '2': 3, '3': 4, '4': 5 }
console.log(arguments.length) // 5
}
show(1, 2, 3, 4, 5)
- 剩余運(yùn)算
function show(...args) {
console.log(args) // [ 1, 2, 3 ]
}
show(1, 2, 3)
3. 箭頭函數(shù)
- 專門對(duì)函數(shù)定義的簡寫語法
// 普通函數(shù)
arr.sort(function(a, b){ return a - b; });
// 箭頭函數(shù)
arr.sort((a, b) => a - b);
a. 去掉function煞肾,在 () 和 {} 之間加 =>
b. 如果形參列表只有一個(gè)形參中贝,可省略( )
c. 如果函數(shù)體只有一句話,可省略{ }
如果僅有的這一句話還是return萧豆,則必須省略return奸披,且結(jié)尾的 ; 也要去掉
4. 改變this指針的幾種方法
let Lesson = {
site: "學(xué)習(xí)",
lis: ['css', 'js', 'vue', 'react'],
show: function () {
console.log(this) // 類方法中的 this 指當(dāng)前對(duì)象
return this.lis.map(function (val) {
console.log(this) // 普通函數(shù)中的 this 指window,如何改變 this 指向當(dāng)前對(duì)象涮雷?
})
}
}
- 通過常量改變
show: function () {
const left = this // left 引用 this指針
return this.lis.map(function (val) {
console.log(left) // left 會(huì)向上查找
})
}
- 通過map的第二參數(shù)
show: function () {
return this.lis.map(function (val) {
console.log(this)
}, this) // 第二參數(shù)
}
- 箭頭函數(shù)
show: function () {
return this.lis.map((val) => {
console.log(this) // 箭頭函數(shù)內(nèi)外 this 一致
})
}
- bind 函數(shù)
show: function () {
return this.lis.map(function () {
console.log(this)
}.bind(this))
}
5. call apply bind
- 三個(gè)函數(shù)的作用阵面,都是用來重新定義 this 這個(gè)對(duì)象的
- 這三個(gè)函數(shù)的第一個(gè)參數(shù)都是 this 的指向?qū)ο螅诙€(gè)參數(shù) apply 傳的是數(shù)組洪鸭,另外2個(gè)一樣是普通傳參
- call 和 apply 函數(shù)調(diào)用后會(huì)立即執(zhí)行样刷,而bind不會(huì),它返回的是一個(gè)函數(shù)览爵,需要重新調(diào)用置鼻,也可以二次傳參
let lisi = {
name: "李四"
};
let wangwu = {
name: "王五"
};
function User(web, url) {
console.log(web + url + this.name)
}
User.call(lisi, "百度", "www.baidu.com");
User.apply(wangwu, ["頭條", "www.toutiao.com"]);
User.bind(lisi, "京東", "www.jd.com")();