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