- function fn(a){
- console.log(a); //5
- }
- fn(5);
参数的个数: 可以传无限个.
参数的类型: 可以是任何数据类型.(当一个函数 A 作为参数, 传到另一个函数 B 中, 被执行, 作为参数的这个函数 A, 叫回调函数)
关系: 实参和形参, 数量一致, 按照顺序一一对应 (形参多, 多出来的形参是 undefined; 实参多, 多出来的实参, 被传到 arguments 对象中)
- function fn(b,a,c){
- console.log(a); //world
- console.log(b); //hello
- console.log(c); //123
- console.log(argument); //Argument{0:"hello",1:"world",2:123,3:456,4:789}
- }
- fn("hello","world",123,456,789) ;
argument: 是一个伪数组, 有长度和索引; 可以通过遍历拿到所有实参.
5. 函数的返回值
返回值: 在函数执行结束后, 得到的数据, 返回到函数的执行语句上.
(默认情况下, 函数返回 undefined, 如果需要有返回值, 要在函数中使用关键字: return)
返回值作用: 如果是处理数据的函数, 处理之后的数据, 有可能需要二次使用, 需要有返回值, 返回处理好的数据
二 函数的作用域
1. 概念: 变量生效的区域
2. 区域: 全局与局部
全局: 整个代码文件, 不属于任何一个函数, 就是全局 (全局作用域下的变量, 叫全局变量)
局部: 每个函数都是一个局部 (局部作用域下的变量, 叫局部变量)
3. 作用域访问的访问规则:
(1) 同级局部不能跨
(2) 父不能拿子, 子能拿父
(3) 多个父子级作用域内都有, 找最近的作用域
三 函数的应用
1. 变量的提升: 使用 var 声明的变量, 会提前到当前作用域的开始的位置, 被声明. 原位赋值.
2. 函数的提升: 所有使用 function 声明的函数, 都会整体提升, 只要在当前作用域内声明了函数, 在当前作用的任何位置都可以使用
(注意: 1. 赋值式创建函数, 提升的是声明, 不是函数
2. 当函数和变量重名, 变量的提升更高, 函数的提升在变量的下面, 导致, 函数生效)
- function fn(){
- console.log(a); //f2
- var a = "hello";
- console.log(a); //"hello"
- function a(){1}
- console.log(a); //"hello"
- a = "world";
- console.log(a); //"world"
- function a(){2}
- console.log(a); //"world"
- }
- fn();
- // 以上代码等价于↓↓↓
- function fn(){
- var a;
- function a(){1}
- function a(){2}
- console.log(a); //f2
- a = "hello";
- console.log(a); //"hello"
- console.log(a); //"hello"
- a = "world";
- console.log(a); //"world"
- console.log(a); //"world"
- }
- fn();
3. 函数的递归: 在函数中执行自己 (递归最重要的就是停止条件)
- // 用递归求 10 的阶乘
- function fn(n){
- if(n == 1){
- return 1
- }else{
- return n * fn(n - 1)
- }
- }
- console.log(fn(10))
- // 利用递归求斐波那契数列 (1,1,2,3,5,8,13,21,34,55,89...)
- function fn(n){
- if(n == 1 || n == 2){
- return 1
- }else{
- return fn(n-1) + fn(n-2)
- }
- }
- console.log(fn(5))
4. 构造函数
构造函数: 不是一种函数, 就是一种执行函数创建数据的方式.
关键字: new(用来执行函数)
- // 创建数值数据:
- var n = new Number(123);
- // 创建字符型数据:
- var s = new String("hello");
来源: http://www.bubuko.com/infodetail-3320993.html