Skip to content

Commit 7b87352

Browse files
committed
commit
1 parent b11bd81 commit 7b87352

2 files changed

Lines changed: 34 additions & 4 deletions

File tree

README.markdown

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,12 @@
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
- 函数提前

chapter4.markdown

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,33 @@
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+
### 术语释义

0 commit comments

Comments
 (0)