一、函数是什么
函数是为执行特点任务封装好的代码块
优势:(提高开发效率)
- 精简代码
- 方便复用
函数的思想: 封装
函数声明语法: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() { 函数体 }()); //推荐写法
六、作用域
- 全局作用域(整个script标签内部)
- 局部作用域(函数作用域,函数内部)
- 块级作用域(块级作用域由{}包括)
变量的作用域
- 全局变量:函数外部let的变量
- 局部变量:函数内部let的变量
- 块级变量:{}内部的let的变量
注意点:
- 若函数内部或者块级作用域内部,变量没有声明,直接赋值,该变量将会提升到全局变量
- 函数内部的形参可以看做局部变量,只在函数内部使用
作用域链
作用域链:采取就近原则的方式查找变量的最终值