js引用类型变量之Function类型(一)

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()的指针.

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值