JavaScript中的函数实际上是对象,每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上只是指向函数对象的指针,保存函数在堆内存中的地址值。

  1、定义函数的三种方式:

  1.1、函数声明方式

 function sum(num1, num2){
  return num1 + num2;
}

  1.2、函数表达式

 var sum = function(num1, num2){
return num1 + num2;
}

  1.3、使用Function构造函数,依次传入命名参数、函数体。这种方式不推荐使用,但这种方式便于我们理解函数名是指针,函数是对象。

 var sum = new Function("sum1", "sum2", "return sum1 + sum2");  //不推荐

  2、函数是对象,函数名是指针

  下面这两行代码如果你弄不懂有什么区别的话,就说明你对函数是对象,函数名是指针还不理解。第一行代码是把sum指向的function对象的地址值赋给anothersum,只是个赋值操作,sum函数并没有执行。关于这里,anothersum和sum对象是保存在栈内存中的,而function对象保存在堆内存中,anothersum和sum存的是function对象在堆内存中的地址值。这里第二行代码是执行sum函数,并把返回值赋值给another。由第二种函数的定义方式比较好区分它们。

 var anothersum = sum;
var anothersum = sum();

  3、为什么没有重载?

  将上面的两个方法转换成下面两个方法的写法,就能很好地理解为什么没有重载了,因为函数名只是个指向函数对象的指针,当定义第二个同名函数的时候,add指向了新的函数对象。

 function add(num){
return num + 100;
}
function add(num){
return num + 200;
} var add = function(num){
return num + 100;
} add = function(num){
return num + 200;
}; alert(add(50)); //

  4、函数声明与函数表达式的区别

  这两种定义函数的方式的区别在于解析器在向执行环境中加载数据的时候,解析器会率先读取函数声明,并使其在执行任何代码前有效,而函数表达式只有在解析器执行到它所在的代码行时才会执行。除了这个区别外这两种定义函数的方式是等价的。看下面这个例子

 alert(sum(10, 20));   //输出30
function sum(num1, num2){
return num1 + num2;
} alert(sum(10, 20)); //报错,sum is not a function,很明显函数表达式还没有被解析器读取到
var sum = function(num1, num2){
return num1 + num2;
}

  5、作为值、参数的函数,另外深入了解sort方法的比较器函数规则,按照数组元素的先后顺序进行比较,如果返回的是正数,则证明object1比object2大,负数相反,0相等,跟Java中Comparator接口的compare方法效果一样。

 function compare(propertyName){
return function(object1, object2){ //函数作为值返回
value1 = object1[propertyName];
value2 = object2[propertyName];
console.log(value1 + " " + value2);
if(value1 > value2){
return 1;
}else if(value1 < value2){
return -1;
}else{
return 0;
}
}
} var data = [{name:"zhangsan", age:23},{name:"lisi", age:25}];
var newData = data.sort(compare("name")); //把函数当做参数
console.log(newData[0].name);  //lisi

  这里把compare函数作为参数传递给了数组的sort函数,在compare函数的内部把函数作为值返回,compare函数可以根据你传入的对象属性进行排序。

  因为函数也是对象,所以它也有属性和方法,关于函数的属性和方法这里不做介绍,有个比较重要的属性prototype,以后再学习。

  

浅析JavaScript之Function类型的更多相关文章

  1. JavaScript之Function类型

    1. 创建方式 //1.函数声明 function sum(num1,num2){ return num1+num2; } //2.函数表达式 var sum = function(num1,num2 ...

  2. JavaScript高级 Function类型

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

  3. JavaScript的Function 类型

    一,Function定义 Function实际上是对象,与其他引用类型一样具有属性和方法.Function可以通过三种方法进行定义,分别是函数声明语法定义,函数表达式定义和Function构造函数定义 ...

  4. JavaScript中的Function类型浅析

    1. Function类型是js中引用类型之一,每个函数实际上都是Function类型的实例对象,具有自己的属性和方法.正因为函数式对象,所以函数名实际上也是一个指向函数对象的指针. 2. 常用的函数 ...

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

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

  6. 《JavaScript高级程序设计》读书笔记 ---Function 类型

    说起来ECMAScript 中什么最有意思,我想那莫过于函数了——而有意思的根源,则在于函数实际上是对象.每个函数都是Function 类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对 ...

  7. JavaScript(第十天)【Function类型】

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

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

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

  9. 《JavaScript高级程序设计》5.5 Function类型

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

随机推荐

  1. Beginners Guide To Learn Dimension Reduction Techniques

    Beginners Guide To Learn Dimension Reduction Techniques Introduction Brevity is the soul of wit This ...

  2. MySQL杂记

    参考资料: w3school  SQL 教程 : http://www.w3school.com.cn/sql/index.asp 21分钟 MySQL 入门教程 : http://www.cnblo ...

  3. C语言中inline的用法

    C语言里面的内联函数(inline)与宏定义(#define)探讨 先简明扼要,说下关键: 1.内联函数在可读性方面与函数是相同的,而在编译时是将函数直接嵌入调用程序的主体,省去了调用/返回指令,这样 ...

  4. 扫描二维码跳转app

    1.判断是否安装了app <html> <head> <meta name="viewport" content="width=device ...

  5. 寒假222_Topcoder SRM648

    序号1: A,随便模拟好了,最后30秒发现一个都比的错误,无奈输错格式. 2: B,问你出去两个点,以及所产生的边 问你:产生多的联通快 加答案加1. 数据小,随便写暴力 3: copy思路. 我们先 ...

  6. codeforces 463D Gargari and Permutations(dp)

    题目 参考网上的代码的... //要找到所有序列中的最长的公共子序列, //定义状态dp[i]为在第一个序列中前i个数字中的最长公共子序列的长度, //状态转移方程为dp[i]=max(dp[i],d ...

  7. 无限互联IOS电影项目视频笔记

    下面是该iOS项目视频教程的内容大纲: 观看指南 (1)项目为第一阶段内容 (2)需要熟练掌握OC语言 (3)UI部分需要学习到第十节课 (4)项目适合刚入门的iOS开发者 1.第一天 (1)iOS ...

  8. Ajax的进阶学习(二)

    JSON和JSONP 如果在同一个域下,$.ajax()方法只要设置dataType属性即可加载JSON文件.而在非同域下,可以使用JSONP,但也是有条件的. Ajax进阶.html: <!D ...

  9. Map中如何把没有定义操作符<的类作为key

    Map中如何把没有定义操作符<的类作为key 其实,为了实现快速查找,map内部本身就是按序存储的(比如红黑树).在我们插入<key, value>键值对时,就会按照key的大小顺序 ...

  10. JavaWeb项目开发案例精粹-第4章博客网站系统-005action层

    1. package com.sanqing.action; import java.util.Date; import java.util.Map; import com.opensymphony. ...