Js-引用数据类型-函数

101 阅读3分钟

一、函数是什么

函数是为执行特点任务封装好的代码块

优势:(提高开发效率)

  • 精简代码
  • 方便复用

函数的思想: 封装

函数声明语法:function 函数名() { 函数体 }

函数调用语法: 函数名() sayHi()

函数命名规范:

  • 和变量命名规则基本一致
  • 尽量使用小驼峰命名法
  • 前缀应该动词: 如 can has is get set load
  • 命名建议: 常用动词约定

函数分为:
具名函数:function fn() {}
匿名函数: function() {}

二、函数传参

声明语法:function 函数名(形参1, 形参n)

调用语法:函数名(实参1, 实参n)

注意:

  • 开发中尽量保持形参和实参个数一致
  • 参数之间用逗号隔开
  • 形参如果不被赋值, 就是undefined

重点:

  • js中,形参比实参多, 或者实参比形参多都可以,不会报错
  • 如果实参比形参多,那么多余的实参传不进函数
  • 如果形参比实参多,那么多余的形参就为undefined

每个函数里面都有一个隐式的arguments,argument是实参列表,他是一个类数组(本质是对象),将函数的实参存储在数组内

function test(x, y) {
    console.log(test.length); // 2
    console.log(arguments.length);  // 3
}
test(2, 4, 6);

形参与实参的映射规则

函数中形参和实参是相互映射的,一个变另一个也会跟着变,但是他们是两个变量

function test(a, b) {
    console.log(arguments); // arguments[1, 2]
    a = 2;
    console.log(arguments); // arguments[2, 2]
    arguments[0] = 3;
    console.log(arguments); // arguments[3, 2]
    }
test(1, 2);

实参列表天生有几位就有几位,只有形参和实参一一对应时才会映射,在函数体内给没有对应实参的形参赋值,并不会改变实参

function test(a, b) {
    b = 2;
    console.log(arguments[1]); // undefined
}
test(1);

三、函数返回值

关键字: return

语法: return 数据

当需要返回数据出去时, 用return关键字

细节:

  • 函数可以没有return, 这种情况函数默认返回值为undefined
  • 在函数体中return能将内部的执行结果返回到函数外部
  • return在函数体中只能运行一次, 执行到return会立即结束当前函数

四、函数表达式

将函数赋值给变量, 这个称为函数表达式

语法:

  • 命名函数表达式: let fn = function a() { 函数体 }
  • 匿名函数表达式: let fn2 = function() { 函数体 }
  • 调用: fn() //函数名

五、立即执行函数

语法1:(function(a, b) { 函数体 })(1, 2);

语法2: (function() { 函数体 }()); //推荐写法

六、作用域

  1. 全局作用域(整个script标签内部)
  2. 局部作用域(函数作用域,函数内部)
  3. 块级作用域(块级作用域由{}包括)

变量的作用域

  1. 全局变量:函数外部let的变量
  2. 局部变量:函数内部let的变量
  3. 块级变量:{}内部的let的变量

注意点:

  • 若函数内部或者块级作用域内部,变量没有声明,直接赋值,该变量将会提升到全局变量
  • 函数内部的形参可以看做局部变量,只在函数内部使用

作用域链

作用域链:采取就近原则的方式查找变量的最终值