1.函数的定义
函数是一种引用数据,也是一种特殊的对象,是对象就能使用点语法。
2.函数的参数
形参:
函数定义的时候,函数名后面括号里的内容。(不存在实际变量)
function fx(a) {}
实参:
函数调用的时候,函数名后面括号里的。(实参可以是常量、变量或表达式。)
fx(a)
函数调用一般是指将实参的值赋给形参,在赋值的过程中,函数里的arguments(数组类型)会接收调用所给的所有的值,并将其保存为数组,然后按排列顺序赋给函数。
function fn(a,b) {
console.log(arguments[0],arguments[1]);
}
fn(1,2)
打印值为,1,2。
既然实参值赋给形参,那么便会出现实参个数多余于形参个数(arguments.length>fn.length)和实参个数小于形参个数(arguments.length<fn.length)。
arguments.length>fn.length
多余值仍存在arguments中不被使用,对函数没有过多影响,但会增加内存,影响性能。
function fx(a,b) {
console.log(a);
console.log(b);
console.log(a+b);
console.log(arguments[2])
}
fx(1,2,3)
打印的结果为a为1,b为2,a+b为3,arguments【2】为3
arguments.length<fn.length
形参没有被赋值的值为undefined
function fx(a,b) {
console.log(a);
console.log(b);
}
fx(1)
打印a为1,b为undefined
3.函数的返回值
函数调用一定会生成一个结果,该结果可以使用与不使用但必定存在。
返回的值可以是任何数据类型。
标准返回
function fx(a,b) {
a=2
return a
}
a=fx(1)
console.log(a);
打印结果为2
异常返回
只会返回undefined
1.没有执行return
function fx(a,b) {
a=1
}
a=fx(1)
console.log(a);
2.执行了return 但是只有return,后面没有表达式
function fx(a,b) {
a=1
return
}
a=fx(1)
console.log(a);
都打印undefined。
4.函数的执行顺序
作用域
一个标识符它在哪些地方能被正常使用,这些地方就是这个标识符起作用的地方,称之为标识符的作用域
全局作用域
直接编写在 script 标签之中的JS代码,也可以是外部引入的js代码,可以作用于所有script的,是全局作用域。
var a=1
function fx(a,b) {
a=2
return a
}
这里的var a=1便是全局作用域。
局部作用域(函数作用域)
1.一般在函数内部就是局部作用域,这个代码的名字只在函数的内部起作用。
2.每调用一次函数就会创建一个新的函数作用域,它们之间是相互独立的。
3.调用函数时创建函数作用域,函数执行完毕之后,函数作用域销毁。
var a=1
function fx(a,b) {
a=2
return a
}
这里的a=2便是局部作用域。
函数执行顺序规则
1.访问一个标识符时 先访问当前作用域,没有就访问外层作用域 直到全局作用域
var a=10
function fx() {
var a=10
return a;
}
var a=1
console.log(a)
re=fx()
console.log(re)
这里打印的re为10,a为1。
2.函数调用一次就会运行一次,而且函数调用如果在A作用域 它是在B作用域生成的 那么函数运行代码在B作用域
var a = 100
function fn() {
var a = 20
function fm() { console.log(a) }
return fm
}
var re = fn()
re()
这里打印的值为20
执行顺序(简易顺序)
1.形参或者局部变量的声明
2.实参赋值给形参变量
3.函数内部会声明
4.运行代码