JavaScript之Function类型

以下的学习笔记来自于一本在 JavaScript 领域非常有名的书籍《 JavaScript 高级程序设计(第 3 版)》,和 孔浩老师的视频教程(孔老师也是参考这本书,丰富了这本书上的内容)。我只是一个知识的搬运工,以期通过搬运知识来加深对知识的理解。

一、基本认识

函数是 ECMAScript 中最最有意思的部分,最最重要的部分。最有意思的根源在于:函数是对象

函数就是一个非常特殊的对象,是一个 Function 类型的实例,其实在内存中存储的操作是通过一个键值对来存储的。

函数的第 1 种定义方式,即使用函数声明语法来定义的:

function fn1() {
  alert("fn1");
}

由于函数是一个对象,所以可以通过如下方式定义,以下是通过函数的拷贝来完成赋值,两个引用并没有指向同一个对象

// 这句话在底层实际上是完成了一次函数的【复制】,fn2 和 fn1 的引用并没有指向同一个对象。
var fn2 = fn1;

fn2();
fn1 = function() {
  alert("fnn1");
}

以下是 函数 和 对象 在 “=” 赋值上的重要区别:

函数虽然是一个对象,但是却和对象有一些区别,对象是通过引用的指向完成对象的赋值的,而函数却是通过对象的拷贝来完成的。
所以上面的函数 fn1 虽然变了,并不会影响 fn2 。

下面我们再来看看对象的赋值,对于对象而言,是通过引用的指向来完成赋值的,此时修改 o1 或者 o2 会将两个值都受到影响:

var o1 = new Object();
var o2 = o1;
o2.name = "Leon";
alert(o1.name);

二、JavaScript 的 函数 没有重载(理解的关键在于“把函数名想象为指针”)

笔者注:正是因为函数名就是一个指针(书上的原话是“函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。”)

这一点其实很好理解,我们看书上的例子就可以了,这一点不再赘述。

三、函数声明与函数表达式

理解关键点:解析器会率先读取函数声明,并使其在执行任何代码之前可以被访问。

四、把值作为函数(在一个函数中返回另一个函数)

我们首先要弄清楚一点:要访问函数的指针,使用函数名不加括号;要执行某个函数,使用函数名加括号。

 

 

下面的一篇文章帮助你理解函数的作用域和闭包的概念。

http://www.cnblogs.com/front-Thinking/p/4317020.html

posted @ 2015-03-05 11:07  李威威  阅读(151)  评论(0编辑  收藏  举报