14.Function類型

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"
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容