函数的定义
函数使用function关键字定义,它可以在函数表达式或函数声明语句中。首先用function关键字打头,然后跟着函数标识符(在函数表达式中可选),一对圆括号,一对花括号。
函数声明语句声明函数
function myEcho(x){
return x;
}
函数表达式声明函数
var square = function(x){return x * x}
函数调用
有4种方式来调用JavaScript函数
- 作为函数
- 作为方法
- 作为构造函数
- 通过它们的call()和apply()方法间接调用
函数调用
通过函数名加参数(如果有的花)调用
function myEcho(a){
return a;
}
myEcho(1);
方法调用
方法,就是保存在一个对象的属性理的JavaScript函数。
// f是一个函数,将该函数赋值给o对象的m属性
o.m = f;
构造函数调用
如果函数调用之前带有关键字new,它就变成构造函数调用
var o1 = new Object();
// 如果构造函数无参,可以不带小括号
var o2 = new Object;
间接调用
使用apply()方法或call()方法
函数的实参和形参
可选参数
当调用函数传入的实参少于形参的时,剩余的参数将会赋值为undefined。因此我们可以给参数设置一个默认值,使其参数可选。
function myAdd(a,b,c = 1){
return a + b + c;
}
myAdd(3,2); // 因为没有给出第三个参数,使用默认值1所以返回值为6
可变长的实参列表:实参对象
每个函数内部都定义来一个名为arguments的属性,这是一个数组,其中的每一个元素都是参数,且按照参数传入顺序存放。
function myMax(/*...*/){
if (arguments.length == 0)
throw new Error("arguments.length == 0");
var max = -Infinity;
for (var i = 0, len = arguments.length; i < len; i++){
if (max < arguments[i])
max = arguments[i];
}
return max;
}
document.write(myMax(1,2,3,4));
callee和caller属性
在arguments对象中还定义callee和caller属性。在严格模式中这两个属性的读写都会产生一个类型错误。在非严格模式中ECMAScript标准规定来callee属性指代当前正在执行的函数。caller是非标准的,代表调用当前正在执行函数的函数。
将对象属性用做参数
如果函数的参数过多,我们就用对象来传参。将传递的参数赋值给对象的属性,然后函数通过对象来访问。
实参类型
因为JavaScript是弱类型语言,函数如果需要的传递的参数是整型而实际传递的是字符串类型,这样这段程序就会出现不可预估的错误。所以我们可以在进入函数的时候首先进行数据类型的判断再执行函数。
函数属性、方法和构造函数
length属性
函数的length属性代表着该函数的形参个数。
function myFunc(a,b){
//实参个数
arguments.length;
//形参个数
arguments.callee.length;
}
prototype属性
没个函数都有个prototype属性,该属性是一个对象的引用。将函数用作构造函数的时候就会从该原型对象继承属性。
call()和apply()方法
f.call(o,1,2);
f.apply(o,[1,2]);
bind()方法
函数中的this值就代表绑定的对象
function f(y){
return this.x + y;
}
f.bind({x:3},2); //返回5
Function构造函数
用Function构造函数创建函数对象,可以通过函数对象调用。
var f = new
// 最后一个参数为函数体的内容,前面的参数都是创建的函数对象的参数
Function("x","y","return x + y");
- Function()构造函数运允许JavaScript在运行时动态创建并编译函数
- 每次调用Function()构造函数都会解析函数体,并创建函数对象。
- 函数体代码的编译总是在顶层函数执行。