在js中使用函数注意三点:
1、函数被调用时,它是运行在他被声明时的语法环境中的;
2、函数自己无法运行,它总是被对象调用的,函数运行时,函数体内的this指针指向调用该函数的对象,如果调用函数时没有明确指定该对象, this 默认指向 window ( strict 模式除外,本文不涉及 strict 模式);
3、函数是一种带有可执行代码的对象类型数据。
一、声明函数
1、使用 function 关键字
复制代码 代码如下:
function myfun(a,b){ //声明名为myfun的函数
return a+b;
}
2、 声明匿名函数
function(a,b){ return a+b;}匿名函数自身是无法保存的,由于在js中函数是一种对象型数据,因此可以把匿名函数赋给变量来保存。
var myfun = function(a,b){ return a+b;}
3、使用函数构造器Function //注意首字母大写
Function 是js内置的一个函数,他是所有函数对象的构造器。(其他数据对象也有自己的内置构造函数,比如Number,Object等,这些构造函数自己的构造器就是Function,因为他们都是函数)。
var myfun = new Function('a,b','return a+b;'); 其中最后一个参数是函数体,前面的参数都是函数的形式参数名,个数不定,因为需要用字符串传参来构造,函数较长时这种写法很不方便,一般很少用,也许你会用它来构造特定的返回值从而取代 eval函数。
需要注意的是,全局变量和全局函数都可以看作window对象的属性,如果存在同名的函数和变量,只能有一个生效(实际上只有一个属性),试试下面的代码。
复制代码 代码如下:
function a(){ alert('a');}
alert(window.a); //访问window对象的属性也可以省去window不写
var a=1;
alert(window.a);
函 数和变量的声明都发生在代码解析期,不同的是,变量在解析期只声明不赋值,因此,同一个作用域内存在同名的函数和变量时,在代码运行期执行到变量赋值之 前,同名函数生效,同名变量赋值之后(用新的数据覆盖了该window对象属性原有的值),变量生效(但是要注意,在firefox 下, 在 with 伪闭包内声明的函数,只能在声明之后才能被调用,即,firefox 的 with 内没有对函数预先声明)。
复制代码 代码如下:
with({}){
a(); //在 firefox 下 a 是未声明
function a(){ console.log("function a is called");}
}
如果同名称的函数被多次声明,后面声明的将覆盖前面声明的,如:
复制代码 代码如下:
alert(func1);//弹出func1(){alert(2);}
func1(){
alert(1);
}
alert(func1); //弹出func1(){alert(2);}
func1(){ //这是最后一次声明的func1,以该函数为准
alert(2);
}
alert(func1); //弹出func1(){alert(2);}
var func1 = function(){ //注意 ,这里是变量赋值,不是函数声明
alert(3);
}
alert(func1); //弹出function(){alert(3);}
除了 IE8 及IE8以下的浏览器,表达式中的函数声明都会返回匿名函数,不会成功声明具名函数
复制代码 代码如下:
if(function fun(){}){
alert(fun); // error,不会成功声明名称为 fun 的函数,但在IE8 及以下的浏览器中中会成功声明一个函数 fun
}
(function fun(){ });
alert(fun); //error但是即使在 IE8 一下, 表达式中的具名函数也不能覆盖该作用于下同名的变量:
var fun = 1; //该变量不能被函数表达式中的函数名覆盖
var f = function fun(){};
alert(f); //function fun(){};
alert(fun); //1
注意区别:
if(fun = function (){}){
alert(fun); // ok,这里声明了一个变量,该变量保存了一个匿名函数
}
js函数是引用型的对象
var a = function(){};
var b=a;
b.x=2;
alert(a.x); //2
二、函数的参数
js函数不会检查函数调用时传入的参数个数与定义他时的形式参数个数是否一致,一般地,js函数调用时可以接收的参数个数为25个,当然不同的浏览器可能有差异,ECMAScript标准对这一点并没有规范。
如果你不确定函数调用时传入了多少个参数,可以使用函数的arguments对象。
arguments 有点像数组,arguments.length 为传入的参数个数,arguments[0] 是第一个参数,arguments[1]是第二个参数,类推...
函数对象的length属性:这个属性很少用到,甚至很少人知道,函数的length属性就是该函数定义时的形式参数个数。
复制代码 代码如下:
function myfun(a,b){
alert(arguments.length); //弹出调用时实际传入的参数个数
alert(arguments[0]); //对应参数a
return a+b;
}
alert(myfun.length); //形参个数,2
arguments对象还有其他属性,比如常用的arguments.callee ,指向该函数自身。