函数的定义方式
给变量x
赋值一个function
函数
var x = function (){};
如何检测变量x
是一个函数
var x = function (){};
console.log(typeof x);
看这就是一个函数(其实这种方法在js中定义了一个变量)把函数定义给变量x
js定义函数的方式
- 函数表达式
- 函数声明 (必须写上函数名字)
函数表达式(把一个函数赋值给了一个变量)
function
关键词前面有东西 就是函数表达式- 1 具名函数表达式
- 2 匿名函数表达式 (常用的)
var x = function (){};//函数表达式
具名函数表达式
var x = function auto//函数名字 (){//具名函数表达式
console.log('heaven');
};
匿名函数表达式
var x = function //匿名函数表达式 (常用的)(){
console.log('heaven');
};
函数声明 :(必须写上函数名字)
function
关键词前面没有任何东西 就是函数声明
function auto(){ //函数声明
console.log('heaven')
}
在js里没有匿名的函数声明如:
function (){//js中不允许这种方式声明函数(语法错误)
console.log('heaven')
}
function
关键词前面没有任何东西就是函数声明,后面就相当于var
变量名字一样
函数的参数
这是一个函数声明
function auto(){
console.log('heaven')
}
function
关键字后面的auto
是函数当前的名字
如何启用函数的名字
function auto(){ //函数声明
console.log('heaven');
}
auto();//启用函数当前名字
在JS中:只有函数名字加上()
才能执行
形参和实参
function auto(a){//a(它是没有任何意义的)只是接收传递过来的实际参数的
//a是函数的形式参数 -->形参
console.log(a);
}
auto(2);//2是函数执行时 传递的实际参数 -->实参
多个形参和多个实参
形参和实参一一对应的情况
function auto(a,b){
console.log(a);
console.log(b)
}
auto(2,"height");
他是可以传递多个参数(形参和实参)执行的
- 形参可以有无数个
- 实参也可以有无数个
- 形参和实参是一一对应的
形参和实参不是一一对应的情况
实参的数量>形参的数量是不会报错的
function auto(a,b){
console.log(a);
console.log(b)
}
auto(2,"height",[1,2,3]);
现在的[1,2,3]
的实参没有形参接收(其实这个[1,2,3]
是被别的东西接收住了)
***到底被谁接住了了呢???***是arguments
function auto(a,b,c){
console.log(a);
console.log(b);
console.log(c);
console.log(arguments);
}
auto(2,"height",null,[1,2]);
arguments
是函数内部的关键词
这种东西叫类数组合(现在可以理解为是一个数组)
arguments
储存所有实参全集(实参列表/不定参)
实参的数量<形参的数量没有接受到实参的形参值是undefined
function auto(a,b,c){
console.log(a);
console.log(b)
console.log(c)
}
auto(2,"height");
其实上面function(){}
函数中花括号中隐式的代码入下
上面的auto(a,b,a)
由隐式的三行代码(如上图第二个黄圈)他会偷偷的给你加上的
在函数的花括号内部会隐式的声明形参(形参是变量)
arguments
函数中的关键词它是存储了所有实参
能不能求去所有实参的和呢
使用arguments
求出实参(实参的个数不确定)的和
function auto (a,b,c){
console.log(arguments);
}
auto(1,2,32,3,10);
arguments.length
存放的是 实参的个数,它是表明当前数组有几项的
function auto(a,b,c){
var sum = 0;//储存实参的和
for(var i=0;i<arguments.length;i++){
sum += arguments[i];
}
console.log(sum);
}
auto(1,2,32,3,10,20);
sum = 0+arguments[0] = 1 i++ i=1
sum = 1+arguments[1] = 3 i++ i=2
sum = 3+arguments[2] = 35 i++ i=3
...
获取形参的个数
console.log(auto.length);//获取形参的个数
实参和arguments
的映射关系
function auto(a,b){
a = 20;
console.log(arguments[0])
}
auto(2,3);
通过形参修改了实参的值 必须形参和实参建立了映射关系时
- 则实参的修改会映射到
arguments
上 - 反之 不会映射到
argument
上
function auto(a,b){
arguments[0] = "heaven";
console.log(a);
}
auto(2,3);
通过arguments
修改是实参的值
- 则实参的修改会映射到形参上
在形参和实参没有建立映射关系的时候能否通过形参的改动映射到失态列表当中呢
function auto(a,b,c){
c = "lalala";
console.log(arguments[2]);
}
auto(2,3);
在建立映射关系上的时候没有索引2的,也就是说形参没有跟实参建立起对应的映射关系的时候是不可能通过修改形参来映射到
argument
上的
函数的return
计算a,b
俩数在auto
外面的和
function auto(a,b){
return a+b;
}
var result = auto(2,3);
console.log(result);//接收抛出来的值
return
也可以结束函数内部的代码
function auto(a,b){
return a+b;
var a = 10;
console.log(a)
console.log(auto)
}
var result = auto(2,3);
console.log(result)
return
是函数里面的关键词 作用:
- 把JS的数据抛出,让这个JS数据可以在函数的外部使用
- 结束函数 不执行函数内部的代码了
函数在不写return
的情况下 ,默认return
是undefined
(也可以把自己给抛出去)