JS函数
概念
函数就是把完成特定功能的一段代码(抽象出来),使之成为程序中的独立实体,起个名字(函数名)。可以在同一个程序或其他程序中多次重复使用(通过函数名调用)
作用
- 使程序变得简短而清晰
- 有利于程序维护
- 可以提高程序开发效率
- 提高了代码的重用性(复用性)
函数的语法
函数声明:
function 函数名(参数){
函数体(具体要执行的代码)
}
//函数名可包含字母、数字、下划线和美元符号(规则与变量名相同)。
函数调用
格式:函数名();
函数的分类
内置函数(系统函数,官方函数)
- alert()
- document.write()
- console.log()
- parseInt(),parseFloat()…
函数表达式(匿名函数)
var x = function (a, b) {return a * b};
Function()构造器
JavaScript 函数是通过 function 关键词定义的。函数也可以通过名为 Function() 的内建 JavaScript 函数构造器来定义。
var myFunction = new Function("a", "b", "return a * b");
var x = myFunction(4, 3);
//等同于
var myFunction = function (a, b) {return a * b};
var x = myFunction(4, 3);
函数提升
Hoisting 是 JavaScript 将声明移动到当前作用域顶端的默认行为。Hoisting 应用于变量声明和函数声明。
正因如此,JavaScript 函数能够在声明之前被调用:
myFunction(5);
function myFunction(y) {
return y * y;
}
使用表达式定义的函数不会被提升
自调用函数
- 函数表达式可以作为“自调用”。
- 自调用表达式是自动被调用(开始)的,在不进行调用的情况下。
- 函数表达式会自动执行,假如表达式后面跟着 ()。
- 您无法对函数声明进行自调用。
- 您需要在函数周围添加括号,以指示它是一个函数表达式:
//匿名的自调用函数
(function () {
var x = "Hello!!"; //我会调用我自己
})();
箭头函数
- 箭头函数允许使用简短的语法来编写函数表达式。
// ES5
var x = function(x, y) {
return x * y;
}
// ES6
const x = (x, y) => x * y;
箭头函数没有自己的 this。它们不适合定义对象方法。
箭头函数未被提升。它们必须在使用前进行定义。
使用 const 比使用 var 更安全,因为函数表达式始终是常量值。
如果函数是单个语句,则只能省略 return 关键字和大括号。因此,保留它们可能是一个好习惯:
const x = (x, y) => { return x * y };
形参,实参
函数的参数是和变量一样使用的
形参就是在函数定义时,函数名后面的参数,不能用var修饰
实参就是调用时,函数名后边的参数
在一般传值调用的机制中只能把实参传给形参,而不能把形参的值反向地传给实参,因此在函数调用过程中,形参值发生改变,而实参中的值不会改变
function addNum(n){
n+=5;
}
var a=10;
addNum(a);
alert(a);
arguments
- 每个函数内部都有一个arguments,系统内置
- arguments用来存储实际传入的参数(实参)
- 属性
arguments.length 输出当前存储的参数的个数 - 访问某一个数据
arguments[下标] 下标是从0开始的 - 优先使用形参,具有可读性
函数的作用域
垃圾回收机制:调用函数的时候,系统会分配对应的空间给这个函数使用(空间大小一般情况下由该函数里声明的变量和形参决定),函数使用完毕之后,这个内存空间要释放,还给系统。
函数内部声明的变量和形参是属于当前函数的内存空间的
内存管理机制:在函数中声明的变量和形参,会随着函数的调用被创建,随着函数的调用结束而被销毁。
局部作用域:在函数中声明的变量和形参,有效范围是当前函数(当前函数的大括号)
就近原则:离哪个作用域近就使用哪个作用域内的同名变量
函数递归
递归
满足以下三个特点
1.函数自己调用自己
2.一般情况有参数
3.一般情况有return
递归可以解决循环能做的所有事情,一些循环不能做的事情
方法
1.首先找临界值,即无需计算,获得的值
2.找这一次和上一次的关系
3.假设当前函数已经可以使用,调用自身计算上一次