文章目录
函数: 能实现某一特定功能的代码集合
1. 定义一个函数
function fn() { // 函数声明
console.log(123);
}
fn(); // 函数调用
console.log(fn.name); // 函数名字 fn
2. 函数参数
(1)形参实参个数一样
function fn(num) {
console.log(num);
}
fn(123);
(2) 实参个数大于形参个数(多余的实参会被无视)
function fn(a, b) {
console.log(a + b);
}
fn(1, 2, 3); //3
(3)形参个数大于实参个数(类似声明变量未定义)
function fn(a, b) {
console.log(a + b);
}
// a = 1; b = undefined
fn(1); // NaN
4. arguments 实参列表
函数的形参与实参一一映射
function fn(a,b) {
a = 3;
console.log(arguments[0]); // 3
}
fn(1,2);
// fn.length 形参个数
// arguments.length 实参个数
5. 函数返回值 return
return作用: ①返回数据 ②结束函数
function fn(a, b) {
return a + b
}
console.log(fn(1, 2)); //3
6. 递归
函数内部又调用了函数自身,我们把这种情况叫做递归
斐波那契数列就是经典的递归算法:
1、1、2、3、5、8、13、21、34、55、89、144、233……
function fib(n) {
if (n == 1 || n == 2) {
return 1
}
return fib(n - 1) + fib(n - 2)
}
for (var i = 1; i < 15; i++) {
console.log(fib(i))
}
7. 函数表达式
var fn = function() {
return 12;
}
console.log(fn());
8. 函数声明的提升(函数能正常执行)
JS在执行前,会有一个预解析的过程,把所有的函数声明,都提升到了最最开头,然后再执行第一行语句。
所以,function定义在哪里,都不重要,程序总能找到这个函数。
//先调用
fun();
//然后定义
function fun(){
console.log("我是函数,我执行了!");
}
9. 函数表达式提升
函数声明会被提升,但是函数表达式却不会被提升
函数表达式提升的是变量,变量提升后并不是一个函数,所以在表达式之前执行,会报错,为类型错误,因为不是函数.
fun(); //报错
var fun = function(){
alert("我是函数,我执行了!");
}
例:
foo(); // 1
var foo;
function foo(){
console.log(1);
}
foo = function(){
console.log(2);
}
10. 自执行函数(函数表达式)
利用闭包原理
(1)方式一
+ function() {
console.log(123)
}();
(2)方式二
- function() {
console.log(123)
}();
(3)方式三
~ function() {
console.log(123)
}();
(4)方式四
(function() {
console.log(123)
})();
11. 函数声明和函数表达式
如果function是声明中的第一个单词,那么就是函数声明;否则就是函数表达式
12. 作用域
函数作用域 全局作用域