# 函数

# 普通函数

1
2
3
4
5
h();			//可以在函数声明前调用
function h() {
alert('hello world');
}
h(); //可以在函数声明后调用

以上的就是普通函数的声明以及调用过程,可以发现,h 函数是可以在声明前被调用的,因为在 JS 解析器向执行环境加载数据时,解析器会率先读取函数声明,并使其在任何代码前可用

# 匿名函数

1
2
3
4
5
h();				//报错, 此时h并未被赋值
var h = function() {
alert('hello world');
}
h(); //运行正常, 此时函数已经赋值给了变量h

以上就是匿名函数的声明以及调用过程,可以发现 h 函数只能在其被赋值后才能使用,按照刚刚普通函数的解释,其实此时这个函数已经被解释器所读取了,但是这个函数并没有名字,所以我们并不能直接使用,而是只能能到这个函数赋值给变量 h 之后,我们才可以通过对 h 函数的调用,来使用这个函数

# JS 代码执行顺序

JS 代码在运行时,会分为两大部分 —— 检查转载和执行阶段

  • 检查装在阶段:会先检测代码的语法错误,进行变量与函数的声明
  • 执行阶段:变量的赋值,函数的调用等,属于执行阶段

# 自执行函数

自执行函数模式是一种语法,可以让函数再顶以后立即被执行

这种模式本质上就是函数表达式 (命名的或者匿名的), 在创建后立即执行

自执行函数由以下几部分组成 :

  1. 使用函数表达式定义一个函数 (函数声明不能起作用)
  2. 在结尾加上一对括号,会让函数立即执行
  3. 将整个函数包裹在一对括号中 (只有在不将函数赋值给一个变量的时候才需要)

功能 :

  • 可以封装大量的工作而不会背后遗留任何全局变量
  • 定义的变量都会成为自执行函数的局部变量,不会污染全局空间
  • 可以使用这种技术模仿一个私有作用域,用匿名函数作为一个 “容器”, “容器” 内部可以访问外部的变量,但是外部无法访问内部的变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//1.使用 !开头,结构清晰,不容易混乱,推荐使用;
!function(){
document.write('ni hao');
}()

//2.无法表明函数与之后的()的整体性,不推荐使用。
(function(){
document.write('wo hao');
})();

//3.能够将匿名函数与调用的()为一个整体,官方推荐使用;
(function(){
document.write('hello');
}());

//4.放在中括号内执行
[function(){
document.write('world');
}()];

//5.使用 + 运算符
+function(){
document.write('ni hao');
}()

//6.使用 - 运算符
-function(){
document.write('ni hao');
}()

//7.使用波浪符 ~
~function(){
document.write('ni hao');
}()

//8.使用 void
void function(){
document.write('ni hao');
}()