一、函数格式
1、函数可以通过声明来创建
function functionName(parameters){
执行代码
}
2、函数也可以通过一个表达式定义存储在变量中
var fun = function(a,b){return a*b;}
二、函数可以自调用
如果表达是后面紧跟();,则会自我调用
(function () {
var x = "Hello!!"; // 我将调用自己
})();
三、函数可以作为一个值或者一个表达式使用
function myfunction(a,b){
return a*b;
}
var x = myfunction(3,4); //结果为12(作为变量)
function myfunction(a,b){
return a*b;
}
var x = myfunction(3,4) * 2; //结果为24(作为表达式)
四、函数提升
使用表达式定义函数是无法提升(匿名函数)
五、函数是对象
函数也有属性和方法 例如:
function myfunction (a,b){
return arguments.length; //返回函数在被调用过程中接收到的参数
}
又例如:
function myfunction (a,b){
return a*b;
}
var str = myfunction.toString(); //将函数作为字符串返回 结果为:function myFunction(a, b) { return a * b; }
六、函数参数(显示参数与隐示参数)
显示参数 parameters 在函数定义时给出
隐示参数 arguments 在函数调用时传递给函数真正的值
JS函数对隐示参数的个数与类型没有检测 定义显示参数时没有指定数据类型
七、Arguements对象
函数有个内置的arguments对象 它包含了函数调用的参数数组 相当于是函数接受的参数被全部放进一个数组arguments[ ]中
通过arguments.length可以简单地知道函数中究竟有多少个参数
八、函数调用
JS中一共有4种方法调用函数
每种方式的不同在于this的初始化
(1)作为一个函数调用
function myfunction(a,b){ return a*b; } myfunction(6,7);
以上函数不属于任何对象,在JS中默认为全局对象
在HTML中默认的全局对象是页面本身,所以函数是属于页面的
在浏览器中页面的对象是浏览器窗口(window对象),函数会自动变为window对象的函数
function myfunction(a,b){ return a*b; } window.myfunction(6,7); //返回42
当函数没有被自身对象调用时,this就会变成全局对象
而在浏览器中全局对象是窗口(window对象)
function myfunction( ){ return this; } myfunction(); //返回window对象
(2)函数作为方法调用
var myObiect={ firstName:"A", lastName:"B", fullName:function(){ return this.firstName+this.lastName; } } myObiect.fullName();
fullName方法是一个函数,函数属于对象,myObject是函数的所有者,所以this的值为myObject对象
测试如下:
var myObiect={ firstName:"A", lastName:"B", fullName:function(){ return this; } } myObiect.fullName();
返回Object
(3)使用构造函数调用
如果函数使用了new,则是调用了构造函数
function myfunction(arg1,arg2){
this.firstName=arg1; this.lastName=arg2; }
var x=new myfunction("A","B"); x.firstName; //返回A
this创建了一个新对象
构造函数的调用会创建一个新对象,新对象继承了构造函数的属性和方法
(4)作为函数方法调用函数
在JS中函数是对象,函数有它的属性和方法
call() 与 apply()是预定义的函数方法,两个方法可以用于调用函数,两个函数的第一个参数必须是对象本身
function myfunction(a,b){ return a*b; } var myObject=myfunction.call(myObject,6,7);
function myfunction(a,b){ return a*b; } myArray=[6,7]; var myObject=myfunction.apply(myObject,myArray); myObject;
call()方法与apply()方法相同的地方在于传入的第一个参数都必须是对象本身
不同的是,applay()方法会将参数作为一个数组传入,而call()方法直接将参数传入
在严格模式下,在调用函数时的第一个参数回座位this的值,即使该参数不是一个对象
在非严格模式下,如果第一个参数的值是null或undefined,它将会使用全局变量代替
this指的是调用函数的那个对象