浅析JavaScript之Function类型

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

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

  1.1、函数声明方式

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

  1.2、函数表达式

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

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

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

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

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

1 var anothersum = sum;
2 var anothersum = sum();

  3、为什么没有重载?

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

 1 function add(num){
 2     return num + 100;
 3 }
 4 function add(num){
 5     return num + 200;
 6 }
 7
 8 var add = function(num){
 9     return num + 100;
10 }
11
12 add = function(num){
13     return num + 200;
14 };
15
16 alert(add(50));  //250

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

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

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

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

 1 function compare(propertyName){
 2     return function(object1, object2){    //函数作为值返回
 3         value1 = object1[propertyName];
 4         value2 = object2[propertyName];
 5         console.log(value1 + " " + value2);
 6         if(value1 > value2){
 7             return 1;
 8         }else if(value1 < value2){
 9             return -1;
10         }else{
11             return 0;
12         }
13     }
14 }
15
16 var data = [{name:"zhangsan", age:23},{name:"lisi", age:25}];
17 var newData = data.sort(compare("name"));    //把函数当做参数
18 console.log(newData[0].name);  //lisi

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

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

  

时间: 2024-10-06 20:03:34

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

【JavaScript】Function类型

JavaScript中,每个函数都是Function类的一个实例. 也就是说每一个定义的函数名都是指向Function类型的一个实例. 函数名中存放的是函数的指针(Function类型实例指针). 可以使用Function的构造函数实现,最后一个参数被视为函数体,如: var sum = new Function("num1","num2","return num1+num2");   //不推荐 1.没有重载 因为函数名中存放的是指针,重新定义

JavaScript之Function类型

以下的学习笔记来自于一本在 JavaScript 领域非常有名的书籍< JavaScript 高级程序设计(第 3 版)>,和 孔浩老师的视频教程(孔老师也是参考这本书,丰富了这本书上的内容).我只是一个知识的搬运工,以期通过搬运知识来加深对知识的理解. 函数是 ECMAScript 中最最有意思的部分,最最重要的部分.最有意思的根源在于:函数是对象. 函数就是一个非常特殊的对象,是一个 Function 类型的实例,其实在内存中存储的操作是通过一个键值对来存储的. 函数的第 1 种定义方式,

JavaScript的Function 类型

一,Function定义 Function实际上是对象,与其他引用类型一样具有属性和方法.Function可以通过三种方法进行定义,分别是函数声明语法定义,函数表达式定义和Function构造函数定义. 1.函数声明语法定义 function functionName(value1...){ //函数体 } 2.函数表达式定义 var functionName = function(value1...){ //函数体 } 3.Function构造函数定义 通过Function构造函数创建函数,可

浅析JavaScript中Function对象(二) 之 详解call&amp;apply

函数是js中最复杂的一块内容,其中call() 和 apply()又是重灾区,初学者往往在这个坑里栽倒,这次来分析这2个函数对象的成员 一.函数的角色 在js的体系下,js有3种角色.分别是普通函数.构造器.对象. 1.普通函数 <script type="text/javascript"> function f1(){ console.log('这是个函数'); } </script> 这里声明的f1,它的角色就是个普通函数 2.构造器 <script

浅析JavaScript中Function对象(一)

一.Function对象及其原型对象 Function对象是js中一个非常重要的对象,所有通过function关键字声明的函数,本质上都是由Function这个特殊的构造器对象创建出来的,也就是new出来的. 首先要明确的一点就是,在JS中万物皆对象,所以函数本身也是对象,只不过函数对象比较特殊,比其他对象多一个prototype属性.所以Function既是对象,也是函数(构造器),其实更准确的说就是函数对象. 其次,更特殊的一点是,由于js中所有的对象都是由构造器new出来的,那么Funct

转载自chaos_JS 的JavaScript中的Function类型浅析

1. Function类型是js中引用类型之一,每个函数实际上都是Function类型的实例对象,具有自己的属性和方法.正因为函数式对象,所以函数名实际上也是一个指向函数对象的指针. 2. 常用的函数定义方式 1. 函数声明: function sum(a , b ){ return a+b; } 2. 表达式: var sum = function(){ return a+b; }; //注意分号 //两种方式的区别: //解释器会率先读取函数声明,并使其在执行之前可以访问,而使用表达式则必须

JavaScript中的Function类型浅析

1. Function类型是js中引用类型之一,每个函数实际上都是Function类型的实例对象,具有自己的属性和方法.正因为函数式对象,所以函数名实际上也是一个指向函数对象的指针. 2. 常用的函数定义方式 1. 函数声明: function sum(a , b ){ return a+b; } 2. 表达式: var sum = function(){ return a+b; }; //注意分号 //两种方式的区别: //解释器会率先读取函数声明,并使其在执行之前可以访问,而使用表达式则必须

JavaScript:Function类型

在JavaScript中,函数实际是对象.每个函数都是Function类型的实例,而且都与其他类型一样具有属性和方法.函数声明方式: // 第一种:使用函数声明语法定义 function sum (num1, num2) { return num1 + num2; } // 第二种:使用函数表达式定义函数 var sum = function(num1, num2) { return num1 + num2; }; // 第三种:构造函数 var sum = new Function("num1

JavaScript基础——引用类型(三)Function类型

在ECMAScript中函数实际上是对象.每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定.函数通常是使用函数声明语法定义的,如: function sum(num1 , num2){ returnnum1 + num2; } 这与下面使用函数表达式定义函数的方式几乎相差无几: var sum = function(num1 , num2){ returnnum1 + num2; };