File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 7979 - [正则表达式直接量语法](chapter3.markdown#a19)
8080- [ 原始值的包装对象] ( chapter3.markdown#a20 )
8181- [ Error对象] ( chapter3.markdown#a21 )
82- - [ 小节 ] ( chapter3.markdown#a22 )
82+ - [ 小结 ] ( chapter3.markdown#a22 )
8383
84- ## 第四章 函数
84+ ## [ 第四章 函数] ( chapter4.markdown#a )
8585
86- - 背景知识
87- - 术语释义
86+ - [ 背景知识] ( chapter4.markdown#a )
87+ - [ 术语释义](chapter4.markdown#a)
8888 - 声明 vs 表达式:命名与提前
8989 - 函数的name属性
9090 - 函数提前
Original file line number Diff line number Diff line change 11# 函数
22
3+ 熟练运用函数是JavaScript程序员的必备技能,因为在JavaScript中函数实在是太常用了。它能够完成的任务种类非常之多,而在其他语言中则需要很多特殊的语法支持才能达到这种能力。
34
5+ 在本章将会介绍在JavaScript中定义函数的多种方式,包括函数表达式和函数声明、以及局部作用域和变量声明提前的工作原理。然后会介绍一些有用的模式,帮助你设计API(为你的函数提供更好的接口)、搭建代码架构(使用尽可能少的全局对象)、并优化性能(避免不必要的操作)。
6+
7+ 现在让我们来一起揭秘JavaScript函数,我们首先从一些背景知识开始说起。
8+
9+ ## 背景知识
10+
11+ JavaScript的函数具有两个主要特性,正是这两个特性让它们与众不同。第一个特性是,函数是一等对象(first-class object),第二个是函数提供作用域支持。
12+
13+ 函数是对象,那么:
14+
15+ - 可以在程序执行时动态创建函数
16+ - 可以将函数赋值给变量,可以将函数的引用拷贝至另一个变量,可以扩充函数,除了某些特殊场景外均可被删除。
17+ - 可以将函数作为参数传入另一个函数,也可以被当作返回值返回。
18+ - 函数可以包含自己的属性和方法
19+
20+ 对于一个函数A来说,首先它是对象,拥有属性和方法,其中某个属性碰巧是另一个函数B,B可以接受函数作为参数,假设这个函数参数为C,当执行B的时候,返回另一个函数D。乍一看这里有一大堆相互关联的函数。当你开始习惯函数的许多用法时,你会惊叹原来函数是如此强大、灵活并富有表现力。通常说来,一说到JavaScript的函数,我们首先认为它是对象,它具有一个可以“执行”的特性,也就是说我们可以“调用”这个函数。
21+
22+ 我们通过new Function()构造器来生成一个函数,这时可以明显看出函数是对象:
23+
24+ // antipattern
25+ // for demo purposes only
26+ var add = new Function('a, b', 'return a + b');
27+ add(1, 2); // returns 3
28+
29+ 在这段代码中,毫无疑问add()是一个对象,毕竟它是由构造函数创建的。这里并不推荐使用Function()构造器创建函数(和eval()一样糟糕),因为程序逻辑代码是以字符串的形式传入构造器的。这样的代码可读性差,写起来也很费劲,你不得不对逻辑代码中的引号做转义处理,并需要特别关注为了让代码保持一定的可读性而保留的空格和缩进。
30+
31+ 函数的第二个重要特性是它能提供作用域支持。在JavaScript中没有块级作用域(译注:在JavaScript1.7中提供了块级作用域部分特性的支持,可以通过let来声明块级作用域内的“局部变量”),也就是说不能通过花括号来创建作用域,JavaScript中只有函数作用域(译注:这里作者的表述只针对函数而言,此外JavaScript还有全局作用域)。在函数内所有通过var声明的变量都是局部变量,在函数外部是不可见的。刚才所指花括号无法提供作用域支持的意思是说,如果在if条件句内、或在for或while循环体内用var定义了变量,这个变量并不是属于if语句或for(while)循环的局部变量,而是属于它所在的函数。如果不在任何函数内部,它会成为全局变量。在第二章里提到我们要减少对全局命名空间的污染,那么使用函数则是控制变量的作用域的不二之选。
32+
33+ ### 术语释义
You can’t perform that action at this time.
0 commit comments