Function类型

ECMAScript中最有意思的就是函数了,有意思的根源,在于函数实际上是对象。每个函数都是Function的实例,具有属性和方法。而重要的一点是,函数名,不过是指向函数的指针,不会与某个函数绑定。

1.函数定义

(1)创建函数有函数声明法和函数表达式法。(2)函数名仅仅是指向函数的指针,所以一个函数可能会有多个名字。(3)函数没有重载,后面会覆盖前面。(4)函数声明会最先被解析,而函数表达式则不会。

 alert(sum(10,10));
function sum(num1,num2){
return num1+num2;
}; //函数声明定义函数,会被率先解析,即使在函数声明之前调用函数,也不会报错 var sum=function(num1,num2){
return num1+num2;
}; //函数表达式定义函数,不会被率先解析,如果在之前调用函数,会报错 function sum(num1,num2){ //函数名仅仅是指向函数的指针,换句话说,一个函数可以有多个名字
return num1+num2;
};
alert(sum(10,10)); //
var anotherSum=sum; //注意,使用不带括号的函数名是访问函数指针,而非调用函数,写成sum()就变成调用函数了
alert(anotherSum(10,10)); //
sum=null;
alert(anotherSum(10,10)); //20,即使将sum设置为null,任然可以正常调用anotherSum() function addSomeNumber(num){
return num+100;
};
function addSomeNumber(num){
return num+200;
};
var result=addSomeNumber(100); //300,将函数名想象成指针,就能理解为什么没有重载,后面的会覆盖前面的
alert(result);

2.函数作为值

ECMAScript中的函数名本身就是变量,所以,函数也可以作为值来始用。不仅可以将函数当作参数来传递,而且可以当做另一个函数的结果返回。从一个函数中返回另一个函数,而是极其有用的方法。

 /*作为值的函数*/
function callSomeFunction(someFunction,someArgument){
return someFunction(someArgument);
}; //第一个参数应该是一个函数,第二个参数应该是要传递给该函数的一个值 function add10(num){
return num+10;
};
var result=callSomeFunction(add10,10);
alert(result); //
function getGreeting(name){
return "Hello,"+name;
};
var result2=callSomeFunction(getGreeting,"Blue Beginner");
alert(result2); //"Hello,Blue Beginner",需要注意的是,访问函数的指针而不是调用函数的话,一定不要带括号 /*从一个函数中返回另一个函数,这是极为有用的方法*/
function creatComparisonFunction(propertyName){
return function(object1,object2){
var value1=object1[propertyName];
var value2=object2[propertyName];
return value2-value1; //此处为一个比较函数
};
};
var data=[{name:"Zachary",age:28},{name:"Nicholas",age:29}];
data.sort(creatComparisonFunction("name"));
alert(data[0].name); //Zachary
data.sort(creatComparisonFunction("age"));
alert(data[0].name); //Nicholas

3.函数的属性和方法

(1)函数内部有两个特殊的对象:arguments和this。arguments用来保存函数的参数,它有一个callee的属性,指向拥有这个arguments的函数。this引用的是函数执行的环境对象。

(2)每个函数都包含两个属性:length和prototype。length:参数的个数。prototype:最耐人寻味,对于ECMAScript中的引用类型而言,它是保存所有实例方法的真正所在。

(3)每个函数都包含两个非继承而来的方法:apply(),call(),用途是在特定的作用域中调用函数。强大在,扩充函数的作用域。

(4)ECMAScript5还定义的一个bind()方法。该方法会创建一个函数的实例。

 /*函数的内部属性*/
function factorial(num){ //这是一个经典的阶乘函数
if(num<=1){
return 1;
}else{
return num*arguments.callee(num-1); //这里,不用factorial(num-1)
}
};
var trueFactorial=factorial;
factorial=function(){
return 0;
};
alert(trueFactorial(5)); //
alert(factorial(5)); //
//将factorial值赋给trueFactorial后,后者便拥有了arguments,这样,中途改变factorial,阶乘函数照样有用,而此时的factorial只是一个返回0的函数罢了 function outer(){
inner();
};
function inner(){
alert(inner.caller);
};
outer();
/*caller*/ /*函数的属性和方法*/
window.color="red";
var o={color:"blue"};
function sayColor(){
alert(this.color);
};
sayColor(); //red
sayColor.apply(this); //red
sayColor.apply(window); //red
sayColor.apply(o); //blue window.color="red";
var o={color:"blue"};
function sayColor(){
alert(this.color);
};
var objectSayColor=sayColor.bind(o);
objectSayColor(); //blue

引用类型之Function类型的更多相关文章

  1. 小红书第五章——引用类型之function类型

    有趣的函数——function类型 函数实际上是对象,每个函数都是function类型的实例,具有属性和方法. 1.函数的定义方法 1)函数声明语法 function sum(num1,num2){/ ...

  2. 引用类型-Function类型

    Function类型 定义函数的三种方式: 1.函数声明 function sum(num1,num2){ return num1 +num2; } 2.函数表达式 var sum = functio ...

  3. JavaScript笔记——引用类型之Object类型和Function类型

    <JavaScript高级程序设计>中介绍的几种JavaScript的引用类型,本文只记了Object跟Function类型 Object类型 创建对象 var person = new ...

  4. Javascript高级编程学习笔记(16)—— 引用类型(5) Function类型

    JS中许多有趣的地方都和函数脱不了联系 那么是什么让JS中的函数这么有趣呢? 我们一起来看看吧 Function类型 在JS中函数实际上就是对象,每个函数都是Function类型的实例,和JS的其他引 ...

  5. 引用类型(三):Function类型

    一. Function类型函数实际上是对象.每个函数都是Function类型都实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象都指针.1.函数通常是使 ...

  6. 引用类型--Function类型(函数声明与函数表达式、arguments.callee、caller、apply、call、bind)

    在ECMAScript中函数实际上是对象.每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定 ...

  7. Function类型

    1.每个函数都是Function类型的,和其他引用类型一样都具有属性和方法.函数也是对象,因此函数实际上是一个指向函数对象的指针. 函数声明语法定义: 方法1: function sum(num1,n ...

  8. String类型,Function类型

    1.String类型:  1)创建String对象:    var str=new String(s);    String(s);    参数:参数 s 是要存储在 String 对象中的值或转换成 ...

  9. JavaScript高级 Function类型

    ·    Function类型 (属于引用类型) 1.JS中,有的函数均是对象,这个一个非常有特点的地方.它既然是对象,那么它的构造函数是谁呢?就是Function.(例如:function Pers ...

随机推荐

  1. range-bar

    https://github.com/edmodo/range-bar

  2. Elasticsearch是一个分布式可扩展的实时搜索和分析引擎,elasticsearch安装配置及中文分词

    http://fuxiaopang.gitbooks.io/learnelasticsearch/content/  (中文) 在Elasticsearch中,文档术语一种类型(type),各种各样的 ...

  3. 探讨一个新的两个进程间的通信和编程模型 (Windows)

    本文探讨一个新的Windows上的两个UI进程间的通信和编程模型. 开门见山,下面是这个通信模型的梗概图: 这个模型的设计目标描述如下: (1)发送数据接口:RpcSend, RpcPost RpcS ...

  4. [ES6] 18. Map

    ES6 provides Map, it is a set of k-v pair. Key can be number, string, object, function and even unde ...

  5. [转]AFNetWorking使用笔记

    转载自:http://blog.sina.com.cn/s/blog_719d537e01017x82.html AFNetwork是一个轻量级的网络请求api类库.是以NSURLConnection ...

  6. 小白日记41:kali渗透测试之Web渗透-SQL手工注入(三)-猜测列名、表名、库名、字段内容,数据库写入

    SQL手工注入 靶机:metasploitable(低)  1.当无权读取infomation_schema库[MySQL最重要的源数据库,必须有root权限]/拒绝union.order by语句 ...

  7. SQL 生成一个日期范围

    有时想按日或月生成一个序列,就像2014-1-1.2014-1-2.2014-1-3... 在sql server中可以写个函数来实现. /* 生成一个日期范围,如2014.01.2014.02... ...

  8. 包加载失败 未能正确加载包“xxx”...

    打开vs2008或者2005如果弹出一个警告对话框 包加载失败 未能正确加载包“xxx” ...... 的字样,就可以用以下方法解决. 在cmd下运行带参数的devenv.exe: "d(盘 ...

  9. oracle索引、 管理权限和角色

    索引 1 单列索引create index 索引名 on 表名(列名): 2复合索引在同一张表上可以有多个索引,但是要求列的组合必须不同.create index 索引名 on 表名(列名1, 列名2 ...

  10. asp.net session容易丢失解决方案

    web Form 网页是基于HTTP的,它们没有状态, 这意味着它们不知道所有的请求是否来自 同一台客户端计算机,网页是受到了破坏,以及是否得到了刷新,这样就可能造成信息的 丢失. 于是, 状态管理就 ...