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. sqlserver 查询库中有多少张表

    表数目:select count(1) from sysobjects where xtype='U' 视图数::select count(1) from sysobjects where xtype ...

  2. Rust: lifetime

    Rust的lifetime算是它最重要的特性之一,也不大好理解,特别是官方文档的介绍有些太过简略,容易让人误解. 这篇文章: Rust Lifetimes 应该可以解答很多人疑惑,特别是有关lifet ...

  3. (翻译)Google Guava Cache

    翻译自Google Guava Cache This Post is a continuation of my series on Google Guava, this time covering G ...

  4. 帝国cms无法注册登录快速解决方法 附路径

    帝国cms安装相对比较简单,一路next,一般从网上下载的系统都会带一些数据,恢复备份数据后,清除缓存,更新数据,一个copy版的网站就出来了.但是为了se的友好需要改动很多地方,不然很容易被认为是s ...

  5. EditorWindow edit ScriptableObject

    using UnityEngine; [System.Serializable] public class Weapon { //[SerializeField] public string weap ...

  6. 7 天玩转 ASP.NET MVC — 第 6 天

    目录 第 1 天 第 2 天 第 3 天 第 4 天 第 5 天 第 6 天 第 7 天 0. 前言 欢迎来到第六天的 MVC 系列学习中.希望你在阅读此篇文章的时候,已经学习了前五天的内容,这也是第 ...

  7. appium获取android app的包名和主Activity

    方法一在appium的android setting中选择下载到电脑上的app包,获取Activity. 方法二在android-sdk中安装build-tools包,进入这个目录.aapt dump ...

  8. JavaScript创建命名空间、类及类成员

    JavaScript代码: //为String对象增加方法isNullOrEmpty String.isNullOrEmpty = function (a) { if (a != null & ...

  9. CodeIgniter 常量ENVIRONMENT设置要注意的地方

    http://bbs.phpchina.com/thread-274514-1-1.html index.php ,这是CodeIgniter的入口文件,做开发是,都会设置一下define('ENVI ...

  10. 深入浅出ES6(九):学习Babel和Broccoli,马上就用ES6

    作者 Jason Orendorff  github主页  https://github.com/jorendorff 现在,我们将向你分步展示如何做到的这一切.上面提及的工具被称为转译器,你可以将它 ...