·ECMAScript函数:
函数对任何语⾔来说都是⼀个核⼼的概念。通过函数可以封装任意多条语句,⽽且可以在任何地⽅、任何时候调⽤执⾏。ECMAScript中的函数使⽤function关键字来声明,后跟⼀组参数以及函数体。
函数的基本语法如下所⽰:
function functionName(arg0, arg1,...,argN) {
statements //封装的函数语句
}
functionName(a,b,......,k)
注:arg0, arg1,...,argN为形参,
a,b,......,k为实参,
参数如果有多个,可以⽤逗号隔开。
形参的类型由实参的类型决定。
形参这个占位符是等待未来传递过来实际值而设置的变量。
形参和实参都没有个数限制,并且将实参赋值给形参是按照顺序赋值的。
实参的个数不一定与形参的个数相同,且没有实参赋值的形参默认值是undefined。
如果实参的个数大于形参, 那么没有形参接受的实参将会被忽略。
以下是⼀个函数⽰例:
function sayHi(name, greet) {
alert("Hello " + name + "," + greet);
}
sayHi("Ninxue", "how are you today?");
这个函数的输出结果是:"Hello Ninxue,how are you today?"。
函数定义中的命名参数name和greet被⽤作了字符串拼接的操做方式。
函数特性:
(1)函数内部的代码是相对封闭的,跟函数外的代码没什么关系。
(2)函数的作用是:用来封装功能。减少代码复用量。
(3)函数内部是相对独立的。
(4)有名函数:命名函数表达式:let fn = function () { },
即:用var , let等声明变量的方式将函数体赋值给一个变量名。
匿名函数:function fn () { } , 即:函数自命名的。
注:无论是有名函数还是匿名函数正常写法都需要进行函数调用 fn()。
可多次调用同一函数,但是函数名不可重复命名。
(5)匿名函数自执行:
IIFE:即时调用函数表达式,自执行功能。
Es5的匿名函数自执行写法:
1. (function (){})()
2. (function (){}())
3. +function(){}()
4. -function(){}()
5. ~function(){}()
6. !function(){}()
例子:设计一个函数接收三个参数,如product(2,5,9),返回值是前两个数字大的那个数与第三个数字的乘积。
注:javascript中的return是只能放在function中的,也就是说如果把上面的if/else放在一个function里就可以了。再或者,把return写成闭包就好了。
Es6的匿名函数自执行写法例子:
块作用域自执行控制台输入密码关键字password无法访问输入的密码值。
{ // 块作用域
let pwd = document.getElementById('pwd')
let btn = document.getElementById('btn')
let password = "" // 用来存储用户的密码
btn.onclick = function () {
password = pwd.value
// console.log(password)
}
}
函数的参数:
命名的参数只提供便利,但不是必需的。
函数声明时,定义的占位形式参数:形参。调用时传入的实际参数:实参。
形参:用于接收函数在调用时,传入的实际数据,命名规则跟变量的命名规则统一。
实参:函数调用时传入的实际数据,该数据会被自动传给对应位置的形参。
形参的默认值:直接在形参后写等号,有默认值的形参必须出现在没有默认值
的后面。否则会出错。
注:函数整体可以作为另外一个函数的参数。
不定参arguments:
1.arguments:是函数内部的一个关键字,用于接收所有的实参,在ES6后取消了arguments。
2.arguments 是一个类数组,有length属性。
3.可以通过访问arguments对象的length属性可以获知有多少个参数传递给了函数。
4.使用例子:
function add () {
var res = 0;
for(var i = 0; i < arguments.length; i++){
res += arguments[ i ]
}
console.log(res)
}
add(1,2) // 3
add(1,2,3) // 6
add(2,3,5,6) //16
5.在ES6里没有不定参arguments,取而代之是剩余参数。
注:剩余参数只能出现在函数的最后一个形参的位置上。
例如:
function add (a,b,...rest) {
console.log(rest)
}
add(1,2) // [ ]
add(1,2,3) // [3]
add(1,2,3,4,5) //[3,4,5]
返回值:
1、return 返回值到外界。
2、如果函数内出现return,则当代码执行return语句时,会立刻停止函数执行,
并返回return后面的值给外界。
3、一个函数内可以写n多个return, 但是一个函数内只有第一个return会执行。
4、当函数内没有写return时,函数执行结束后默认return undefined。
递归方法:
递归:一个函数平凡调用自身。
递归的规律:先执行的最后执行完。
例子:
注:虽然递归的规律求值可以用for循环来编写,但是也可以用于一些特殊情况简化代码。
函数声明的提升(预解析):
JS执行过程:先预编译(解析)过程,再把所有的函数声明都提升到最开头,然后再按顺序执行。
注:函数声明会被提升,但是函数表达式却不会被提升。
1.函数声明的方式定义一个函数:
function fn() {}
2. 函数表达式的方式定义函数:
var fn = function () {}
3. 函数类型:为引用数据类型 function
注:如果变量名和函数名重名的话, 以函数为优先。正常情况下给同一个变量赋予不同的值,都是后面的值覆盖前面的值。