函数
函数的定义:
函数,是一种封装。就是将一些语句,封装到函数里面。通过调用的形式,执行这些语句。
函数必须通过调用才可以使用。调用时通过其函数名调用,后面要加上一对圆括号。
函数的创建
function fn1(arg1,arg2) {
// 函数的语句块
console.log("a");
}
-
函数在创建时就创建这个函数名的变量,因为它是全局,所以就会被覆盖,覆盖前仍然可以执行当前,覆盖后,函数不能够执行了
-
如果函数中没有使用return关键词,函数返回一个undefined值
-
变量什么时候定义,这个变量才能在栈中产生,才可以被调用
函数的声明
- 匿名函数声明1
var box=function(num1,num2){
retrun num1+num2;
}
声明函数的时候没有赋予名称,但是函数声明好以后却赋值给了box,这里注意box并不是num1+num2的值,而是function定义的这个匿名函数。
- 匿名函数声明2
var obj={
name:”zhangsan”,
fire:function(num1,num2){
var s=num1+num2;
return s;
}
}
在对象中,可以设置一个属性是一个函数,这样就给了对象定义了一个方法。
- Function构造函数
var box=new Function('num1','num2','retun num1+num2');
//num1,num2参数,最后的字符串是函数体
第三种方式我们不推荐,因为这种语法会导致解析两次代码(第一次解析常规JS代码,第二次是解析传入构造函数中的字符串),从而影响性能,但我们可以通过这种语法来理解函数是对象,函数名是指针的概念。
函数的执行
- 普通函数执行
函数执行 :函数名()
执行后,可以完成函数的代码内容,如果函数内有return 值,这时候执行后会返回该值。
function abc() {
return 3+4;
}
var s=abc();
如何没有return,则执行完所有代码
- 函数的独立执行
函数自身是可以独立执行的,并且也可以把独立执行的结果赋值给一个变量。
var s=0;
(functiion(){
s=4+5
})();
左边是匿名函数自己执行,右边是匿名函数赋值
注意匿名函数用小括号括住,最后再执行小括号。
注意,除了匿名函数可以独立执行,实名函数也是可以独立执行的,不过这种独立执行就不能在该函数中添加参数了,并且匿名函数,也只能在此执行一次,不能多次调用,显而易见的好处是,该函数内的变量统统是私有变量。
函数的删除
- 匿名函数删除
函数=null - 对象下的方法删除
delete obj.fun
函数对象
- 函数是一个对象,这种普通函数创建,在script被执行时,就放入堆中,并且在栈中以函数名作为变量引用堆中这个函数地址
- 函数是对象,因此具备引用关系
- JS中的函数是对象,因此函数也有属性和方法。每个函数都包含两个属性:length和prototype。其中,length属性表示函数希望接收的命名参数的个数
函数的参数
-
构造函数创建,每个参数都必须是字符串
-
在函数后面括号中填写的变量叫做参数
-
除了最后一个参数是函数的语句块以外,前面所有的参数都是该函数的参数
-
函数如果没有参数,它处理是不能变化,
-
在js中,因为js是一种弱类型语言,因此不能对参数约束其类型, 这就会造成,因为使用函数者输入的参数不符合需求而造成代码出错,无法通过白盒测试
-
ES5版本中 js中参数不能设置初始值,不填写参数就是undefined
-
参数目的是解决函数在不同清空下解决不同问题
-
在设计函数时,尽量不要让函数内部与外部有关联,尽量让函数内部是一个独立的个体
-
函数的抽象化:根据具体要求填写内容
-
实参argument
函数的功能、好处:
1) 将会被大量重复的语句写在函数里面,这样以后需要这些语句的时候,直接调用函数,不用重写那些语句。
2) 简化编程,让编程变的模块化。
实参和形参
-
实参:真实的数值、字符串
-
形参parameter一个接收实参的变量
实参是按照形参顺序一一赋值给形参
形参全称为"形式参数"
由于它不是实际存在变量,所以又称虚拟变量。是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数.在调用函数时,实参将赋值给形参。因而,必须注意实参的个数,类型应与形参一一对应,并且实参必须要有确定的值。
如果实参数量小于形参数量,后面的形参值就是undefined
形参和实参的区别
-
形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。 实参出现在主调函数中,进入被调函数后,实参变量也不能使用。
-
形参和实参的功能是作数据传送。发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。
-
形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回
主调函数后则不能再使用该形参变量。 -
.实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形 参。 因此应预先用赋值,输入等办法使实参获得确定值。
-
实参和形参在数量上,类型上,顺序上应严格一致, 否则会发生“类型不匹配”的错误。
-
函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。
-
当形参和实参不是指针类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的内容复制一份,在该函数运行结束的时候形参被释放,而实参内容不会改变。
而如果函数的参数是指针类型变量,在调用该函数的过程中,传给函数的是实参的地址,在函数体内部使用的也是实参的地址,即使用的就是实参 本身。所以在函数体内部可以改变实参的值。
arguments的使用
- 定义函数时没有定义参数
- 如果实参数量大于形参数,使用arguments
- arguments只能出现在函数语句块中,用于当前函数的参数不固定数量
- arguments.callee:当前函数
- arguments.callee.name:当前函数的名字
- arguments.callee.caller:调用当前函数的外部函数