JavaScript学习日记 : Day6 - 函数(一)

1.函数的重要性

因为函数是Javascript世界的第一等公民,指的是函数与其他数据类型一样,处於平等地位,可以赋值给其他变数,也能作为参数传入另一个函数,或者作为别的函数的返回值。

2.函数的四种型态

2.1 声明型态

function funcA() {
    console.log("函数的声明型态")
} 

--> 调用方式 funcA(), (Function funcA()...)()

2.2 表达式

//表达式(一)
let funcB = function() {
    console.log("函数的表达型态")
}

--> 调用方式 funcB(), (funcB)()

//表达式(二)
(function() { console.log("函数的表达型态2") })

--> 调用方式 (function() {})()

2.3 函数的嵌套型态

let funcC = function() {
    console.log("函数的嵌套型态")
    let funcD = function() {
        console.log("函数D嵌套在函数C里面")
    }
}

2.4 函数的闭包型态

let funcE = function() {
    let a = "funcE"
    return function() {
        alert("我是以闭包型态存在的函数"+a)
    }
}

3. 函数的声明提升(Hoisting)

只有声明型态的函数才具有提升的特性。至於为什麽会有这种现象,在之後的作用域主题会得到解答。

console.log(funcA); // funcA() {return 0}
console.log(funcB); // undefined
//声明型态
function funcA() {
    return 0
}

//标达型态
let funcB = function() {
    return 1
}

上面的代码等同於 :

let funcB

function funcA() {
    return 0
}

console.log(funcA); // funcA() {return 0}
console.log(funcB); // undefined

funcB = function() {
    return 1
}

另外再看一个例子:

console.log(a); // undefined
console.log(b); // 报错,b is not defined

var a = 123;
let b = 456;

原因在於ES6提供了let,可以避免hoisting的问题发生。

4. IIFE与匿名函数、具名函数

IIFE(Immediately-invoked Function Expression,立即执行函数)为函数的一种调用方式,非常适合匿名函数调用。

(function() {
    conosole.log("我是立即运行的匿名函数")
})();

(function() {
    console.log("我也是立即运行的匿名函数")
}())

那既然有了IIFE,为何要有具名函数?

  1. 最好的理由就是方便递归
(function funcName(i) {
    console.log(`函数名为${funcName.name},第${i}次调用`)
    if(i<3) { //递归出口
        funcName(++i) //递归
    }
})(1)

//函数名为funcName,第1次调用
//函数名为funcName,第2次调用
//函数名为funcName,第3次调用
  1. 匿名函式不利於追踪,具名函数方便搜寻。

5. 高阶函数

如果某个函数可以接收另一个函数作为参数,该函数就称为高阶函数。

function fn1(callback) {
    if(callback){
        callback();
    }
}

fn1(function() {
    alert("高阶函数")
})

<<:  [Day 18] Node.js 的非同步小实验

>>:  DAY18 MongoDB Replication 实战

DAY11 - [JS] 经典的ToDoList

今日文章目录 ToDoList 需求 事前准备 参考资料 ToDoList 需求 Q: 需要有哪些...

DAY19-JAVA的抽象类别(2)

利用父类别的变数来存取子类别物件的成员 public class Test{ public stat...

Day06_专案预告

今天要开始预告我们专案开发怎麽开发罗 Day06_专案预告 ...

Day17-Kubernetes 那些事 - Auto Scaling

前言 之前的文章介绍了如何利用 ReplicaSet 或 Replication Controlle...

AAC 转档 MP3

对於AAC 这个音讯格式,可能大多数人都不太熟悉。但是AAC 是 iTunes 里常见的音乐档案格式...