Function 類型
- 函數(shù)實(shí)際上是對(duì)象
- 函數(shù)都是 Function 類型的實(shí)例(具有自己的屬性和方法)
- 函數(shù)名實(shí)際上是指向函數(shù)的指針
函數(shù)聲明
// 函數(shù)聲明
function sum(num1, num2){
return num1 + num2
}
// 函數(shù)表達(dá)式
var sum = function(num1, num2){
return num1 + num2
}
函數(shù)名是指針
function sum(num1, num2){
return num1 + num2
}
console.log(sum(10, 10)) // 20
var anotherSum = sum
console.log(anotherSum(10, 10)) // 20
sum = null
console.log(anotherSum(10, 10)) // 20
函數(shù)沒有重載
function addSomeNumber(num){
return num + 100
}
// 函數(shù)名指針重新指向新的對(duì)象
function addSomeNumber(num){
return num + 200
}
console.log(addSomeNumber(100)) // 300
函數(shù)聲明和函數(shù)表達(dá)式的區(qū)別
console.log(sum(10, 10)) // 20
// 函數(shù)聲明提升,在執(zhí)行任何代碼之前可用
function sum(num1, num2){
return num1 + num2
}
console.log(sum(10, 10)) // sum is not a function
// 只有執(zhí)行到所在代碼行才會(huì)執(zhí)行
var sum = function(num1, num2){
return num1 + num2
}
作為值的函數(shù)
可以作為參數(shù)傳入函數(shù),或者作為函數(shù)的返回值
function callSomeFunction(someFunction, someArgument){
return someFunction(someArgument)
}
function addTen(num){
return num + 10
}
console.log(callSomeFunction(addTen, 10)); // 20
應(yīng)用
數(shù)組對(duì)象根據(jù)某個(gè)對(duì)象屬性排序
function compare(propertyName){
return function(object1, object2){
var value1 = object1[propertyName]
var value2 = object2[propertyName]
if(value1 < value2){
return -1
}else if(value1 > value2){
return 1
}else{
return 0
}
}
}
var data = [{name:"ChangLau", age: 26}, {name:"Donbad", age: 25}]
console.log(data.sort(compare("age")))
// [{…}, {…}]
// 0: {name: "Donbad", age: 25}
// 1: {name: "ChangLau", age: 26}
console.log(data.sort(compare("name")))
// [{…}, {…}]
// 0: {name: "ChangLau", age: 26}
// 1: {name: "Donbad", age: 25}
函數(shù)內(nèi)部屬性
- arguments,arguments 主要用于保存函數(shù)參數(shù),另外還有一個(gè) callee 屬性,指向擁有這個(gè) arguments 的函數(shù)(也就是當(dāng)前函數(shù))
- this,引用的是函數(shù)執(zhí)行的環(huán)境對(duì)象
arguments
function factorial(num){
if(num <= 1){
return 1
}else{
return num * arguments.callee(num - 1)
}
}
this
window.color = "red"
var o = { color : "blue" }
function showColor(){
console.log(this.color);
}
console.log(showColor()); // "red"
o.showColor = showColor
// 函數(shù)執(zhí)行環(huán)境對(duì)象
console.log(o.showColor()); // "blue"
函數(shù)對(duì)象屬性 caller
保存著調(diào)用當(dāng)前函數(shù)的引用(調(diào)用當(dāng)前函數(shù)的引用,如果是在全局環(huán)境中調(diào)用值為 null)
function outer()}{
inner()
}
function inner(){
console.log(inner.caller)
}
outer()
// ? outer(){
// inner()
// }
函數(shù)屬性和方法
屬性
length 屬性表示函數(shù)希望接收的命名參數(shù)的個(gè)數(shù)。
function sayName(name){
console.log(name);
}
console.log(sayName.length); // 1
function sum(num1, num2){
return num1 + num2
}
console.log(sum.length); // 2
prototype 屬性保存實(shí)例方法真正所在
function Person(name, age){
this.name = name
this.age = age
}
Person.prototype.showInfo = function(){
console.log(this.name, this.age)
}
var p = new Person('ChangLau', 25)
p.showInfo() // ChangLau 25
方法
call() 和 apply()
修改函數(shù)賴以運(yùn)行的作用域
var name = 'ChangLau'
var obj = {
name: 'Donbad',
age: 25
}
function showInfo(age){
return this.name + ' ' + age
}
console.log(showInfo.call(window, 25)); // ChangLau 25
console.log(showInfo.call(obj, 25)); // Donbad 25
console.log(showInfo.apply(window, [25])); // ChangLau 25
console.log(showInfo.apply(obj, [25])); // Donbad 25
bind()
創(chuàng)建一個(gè)函數(shù)實(shí)例,其 this 值會(huì)被綁定到傳給 bind()函數(shù)的值
var name = 'ChangLau'
var obj = {
name: 'Donbad',
age: 25
}
function showInfo(age){
return this.name + ' ' + age
}
var showWindowInfo = showInfo.bind(window)
console.log(showWindowInfo(25)) // "ChangLau 25"
var showObjInfo = showInfo.bind(obj)
console.log(showObjInfo(25)); // "Donbad 25"