函数【function】
A.【函数定义】
将一些代码(为了完成一些特定的功能) 封装在一起
完整的函数的格式
function 函数名(形参1,形参3...){
代码
return 返回值 }
函数不会自动执行 需要手动调用
函数调用:
函数名(实参1,实参2...);
如果定义了形参 但是不传递实参进去 形参默认值就是 undefined;
如果没加 return 默认返回的是 undefined
如果函数中有return的话 函数执行到return会立即停止
定义一个求两个数字的和的函数
function add(a, b) {
var sum = 0;
sum = a + b;
return sum;
}
var sum = add(2, 3);
console.log(sum);
console.log(add(70, 80));
不带形参和返回值的函数
function print(){
console.log("Hello World!!!");
}
print();
print();
如果定义了形参 但是不传递实参进去 形参默认值就是undefined;
如果函数中有return的话 函数执行到return会立即停止
function print(arg){
console.log(arg);
// return;
// console.log(12323332);
}
print("你好");
print("静夜思");
如果定义了形参 但是不传递实参进去 形参默认值就是 undefined;
如果没加 return 默认返回的是 undefined
如果函数中有return的话 函数执行到return会立即停止
print();
可以定义一个变量来接收函数返回值
var res = print("今天开始学习函数了 好激动");
console.log(res);
B.函数声明提前:
print1("hello");
function print1(arg) {
console.log(arg);
}
以上的代码在执行时 正确的位置
function print1(arg){
console.log(arg);
}
print1("hello");
变量提前会在 函数前面
add();
var num=1;
function add(){
console.log(num);
}
真正的执行顺序:
var num;
function add(){
console.log(num);
}
add();
num=1;
C.函数的作用域:
js在es6 之前 没有块级作用域 只有全局作用域和局部作用域
全局作用域
全局作用域: 在函数外部定义的变量(在任何地方都能使用) 在函数内部定义的变量我们成为局部变量
调用函数时会优先使用函数内部的变量 没有的话再找全局变量 函数内部变量的声明也会提前
var num = 1;
function add(){
var num=2;
console.log(num);
num++;
return num;
}
console.log(add());
console.log(num);
// var num ;
// function add(){
// num=2;
// console.log(num);
// num++;
// return num;
// var num;
// }
// num=1;
// console.log(add());
// console.log(num);
D.【try catch 捕获错误】
为了避免 程序出现错误 而引起整个程序的崩溃我们可以使用错误捕获
num++;
console.log("我能执行吗");
// try执行可能出现错误的代码
try {
var num=1;
num++;
// catch当 try中的代码出现错误时会捕获
} catch (error) {
console.log(error);
}finally{// 无论try中的代码是正确的还是错误的 都会执行 finally中的代码
console.log("finally")
}
console.log("我能执行吗");
function add(num1,num2){
try {
var res = num1+num2;
} catch(err){
}
return res;
}
/
E.【arguments对象】
是系统内置的 专门用于储存函数传递的参数
function add() {
console.log(arguments);
// 我们可以通过索引号来获取到 传递的实参
// console.log(arguments[0],arguments[1]);
var sum = 0;
// arguments.length 表示的参数的个数
for(var i =0;i<arguments.length;i++){
sum+=arguments[i];
}
return sum;
}
console.log(add(1, 2,3,4,5,6,7,8,9));
F.递归函数(函数之间的相互调用)
如果函数 最后返回值是调用函数本身 我们称为递归函数 注意一定要避免死循环 一定要有明确的退出条件
【经典案例】判断 斐波那契数的第 20位是多少
// 1 1 2 3 5 8 13
// 第 n的黄金数 = 第n-1位的黄金数 + 第n-2位的黄金数
function goldNum (n){
if(n==1||n==2){
return 1;
}
return goldNum(n-1)+goldNum(n-2);
}
/*
g(5) g(4 ) + g(3)
g(3) +g(2); g(2)+g(1) =1+1;
g(2)+g(1)+1 = 3 + 2
*/
// console.time("timer");
// console.log(goldNum(40));
// console.timeEnd("timer");
G.函数表达式
定义一个变量 然后给这个变量赋值一个函数
console.log(add); // add的声明会提前
var add = function (a,b){
return a+b;
}
console.log(add(2,3))
(函数很重要,在后期的实际开发过程中,几乎都需要它,现在打好基础,将来少留遗憾!!!)