1.在ECMAScript中,函数被认为是对象,每个函数都是Function的实例,都具有属性和方法.因此,函数名实际上是一个指向函数对象的指针,不会与某个函数绑定.有两种定义方法:
a.声明式:function sum (num1,num2){return num1+num2;}
b.用函数表达式定义:var sum = function (num1,num2){return num1+num2;};
以上两者不同的是,解析器会在想执行环境加载数据时,会先读取函数声明,使其在执行任何代码之前可用(可以访问),而函数表达式,必须等到解析器执行到当前代码所在行是才会被执行.
注意:使用不带圆括号的函数名是访问函数指针,而非调用函数,举个例子:
2.在js中,函数名本省就是变量,可以作为参数传递给函数,也可以当做函数的结果返回.
function callSomeFunuction (someFunction , someArguments){
return someFunction (someArguments);
}
function add10(num){
return num+10;
}
var result1 = callSomeFunuction (add10,10);
console.log(result1);//20
function getGreeting(name){
return "Hello, " + name;
}
var result2 = callSomeFunuction (getGreeting,"Nicholas");
console.log(result2);//Hello,Nicholas
可以从一个函数中返回另一个函数,这也是极为有用的一种技术,在举个例子;
function createComparisonFunction (propertyName){
return function(object1,object2){
var value1 = object1.[propertyName];
var value2 = object2.[propertyName];
if (value1 < value2)
{
return -1;
}else if (value1 > value2)
{
return 1;
}else
return 0;
};
}
var data = [{name : "brancepeng",age : 22},{name : "luwenxu",age : 28}];
data.sort(createComparisonFunction("age"));
alert(data[0].age);//22
3.函数的内部属性:arguments和this其中,arguments是一个类数组对象,包含着传入数组的所有参数,它的主要用途是保存函数参数,但这个对象还有一个叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数.
请看下面例子:function factorial(num){
if (num <= 1)
{
return 1 ;
}else
{
return num*factorial(num-1);
}
}
以上是一个计算阶乘的函数.但是这个函数名和函数紧紧耦合了,消除这种现象,可以使用arguments.callee.
function factorial(num){
if (num <= 1)
{
return 1 ;
}else
{
return num*arguments.callee(num-1);
}
}
var trueFactorial = factorial;
factorial = function (){
return 0;
}
console.log(trueFactorial (5)); //120
console.log(factorial (5)); //0
另一个对象this:引用的是函数据以执行的环境对象--或者说也可以是this值(当在网页全局作用域中调用函数时,this对象引用的就是window).来看下面的例子:
window.color="red";
var o = {color : "blue"};
function sayColor(){
console.log(this.color);
}
sayColor(); //blue
o.sayColor = sayColor;
o.sayColor(); //red
当直接调用函数时,由于函数的作用域为window对象,结果为"red",然后创建属性o.sayColor,并且让她指向和
sayColor这个函数名所指向的同一个引用,此时调用o.sayColor()函数时,作用域为o,则this对象引用的是对象o.
此外,ECMAScript也规定了函数的另外一个属性:caller,和arguments一样,保存数据,不过他保存的是(调用当前函数的)函数的引用,如在全局作用域中调用该函数,他得知为null,举个例子:
function outer(){
inner();
}
function inner(){
alert (inner.caller);
}
outer();
以上代码会导致警示框中显示outer()函数的源代码,因为outer调用了函数inner(),所以inner.caller就指向了outer();当然,为了实现更松散的耦合,可以使用arguments.callee.caller,即:
function outer(){
inner();
}
function inner(){
alert (arguments.callee.caller);
}
outer();
上面的arguments.callee是指向拥有这个arguments的函数inner()的指针.