一、函数的语法
函数的定义:有两种定义方式 声明式 和 赋值式
(1)声明式:(调用可以在定义之前或者定义之后)
function 函数名(){
要执行的代码段
}
// function是一个关键字,函数名自定义,定义规则和变量的定义规则相同
//函数调用
函数名()
(2)赋值式:(调用只能在定义之后)
var 变量名 = function 函数名(){
要执行的代码段
}
函数的参数
我们在定义函数和调用函数的时候都出现过 ( )
这个 ( ) 的作用就是用来放参数的位置;参数分为两种 形参 和 实参
声明函数时候带进去的那个参数叫形参
调用函数的时候给形参进行赋值的实际是实参
注意:
形参和实参的个数不对应时:
形参多于实参时,多出来的形参,值为undefined
形参少于实参时,多出来的实参,则没有意义
函数的调用
在函数中所使用的变量,也就是在函数外不能调用
如果不给形参赋值,那么在函数中使用时,形参的值为undefined
通过实参来给形参赋值
二、匿名函数
//当将一个函数赋值给一个变量的时候,这个函数的名字就没有用了,所以我们可以将这个函数名称省略:
//函数名则不能再进行调用
//这种没有名字的函数就叫做匿名函数
var 变量名 = function (){
要执行的代码段
}
//匿名函数不能单独存在,会报错:
function(){
console.log(a)
}
//将这个函数用小括号括起来就不会报错,
//在后面加小括号就表示调用匿名函数,这种定义并调用函数的语法,叫做自执行函数。
//自执行函数的好处:独立的作用域,不会污染全局环境!
(function(){
console.log(a)
})()
//自调用函数也可以不给函数加小括号,其他常见形式:
(function(){
console.log(a);
}());
!function() {
console.log(a);
}();
+function() {
console.log(a);
}();
-function() {
console.log(a);
}();
~function() {
console.log(a);
}();
//这种函数也是可以传参的
(function(a,b){
var c = a + b;
document.write(c);
})(1,2);
三、argument对象 和 return
arguments对象:(只要函数才有arguments对象)
是ES6之前函数中自带的对象,专门用来接收函数调用时所传递实参,该对象返回的结果是一个伪数组,伪数组:只具有数组的下标(索引或位置)和length(个数)属性,不具有数组的方法
(1)具有数组的length属性
(2)按照索引的方式进行存储的
(3)它没有真正数组的一些方式:pop() push()等等
function fn(){
//由于arguments对象这个单词有点长,因此专门创建一个变量来接收该对象
var arg=arguments
console.log(arg)
console.log(arg.length)
//arg[o]:专门用来获取对象中指定下标所对应的值
// console.log(arg[o])
// console.log(arg[2])
//获取arg对象中所有的实参(元素)//遍历的是每个实参所对应的下标
for(var i=0;i<arg.length;i++){console.log(i,arg[i])
}
fn(10,20,30,40,50)
return
function fn(){
//return在返回结果的时候,只能返回一个结果,不能返回多个
//return关键字除了可以给函数调用返回结果,还可以结束函数运行
return 需要返回的结果;
}
var 变量名=fn()
console.log(变量名)
(1)我们函数只是实现某种功能,最终的结果需要返回给函数的调用者函数名( )通过return实现的
(2)只要函数遇到return 就把后面的结果返回给函数的调用者函数名( )=return 后面的结果
return总结:
(1)终止代码继续运行
(2)函数运行后返回一个结果,只能返回一个
四、预解析
1.预解析:在代码执行之前,先对代码进行解释,被称为预解析也就是声明提升
在js中有两个地方会出现声明提升:
(1)使用var关键字创建的变量具有声明提升
(2)使用function函数名( ){ }创建的函数具有声明提升
注意:赋值式函数会按照var关键字的规则进行预解析
预解析总结:
(1)匿名函数赋值给变量的定义方式,预解析时遵循变量的预解析规则,不会将函数代码预解析
(2)预解析的时候,会将定义提前放在内存中,不会提前将赋值放在内存中
(3)如果变量名和函数名同名了,保留函数预解析,忽略变量预解析
因为函数预解析其实包含了赋值的过程,函数定义放在内存中的时候将函数的代码也放在内存中
变量的预解析只有空间,没有值,所以如果是先预解析变量,那后面的函数预解析赋值就将空间中放入了值,如果是先预解析的函数,再次预解析变量的时候,空间已经存在了,再次定义空间也是没有意义的。
(4)省略var定义的变量是不会有预解析的
(5)js代码如果报错了,那后面的代码就不会执行了
(6)不会执行的代码中有变量或函数定义也会预解析,因为预解析在执行之前。