1.函数声明
1
2
3
<code>function</code> <code>sum1(n1,n2){</code>
<code> </code><code>return</code> <code>n1+n2;</code>
<code> </code><code>};</code>
2.函数表达式,又叫函数字面量
<code>var</code> <code>sum2=</code><code>function</code><code>(n1,n2){</code>
<code>};</code>
两者的区别:解析器会先读取函数声明,并使其在执行任何代码之前可以访问;而函数表达式则必须等到解析器执行到它所在的代码行才会真正被解释执行。
自执行函数严格来说也叫函数表达式,它主要用于创建一个新的作用域,在此作用域内声明的变量,不会和其它作用域内的变量冲突或混淆,大多是以匿名函数方式存在,且立即自动执行。
<code>(</code><code>function</code><code>(n1,n2){</code>
<code> </code><code>console.log (n1+n2)</code>
<code>})(1,3);</code><code>//4</code>
另外几种自执行函数:
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<code>//可用来传参</code>
<code>(</code><code>function</code><code>(x,y){</code>
<code> </code><code>console.log(x+y);</code>
<code>})(2,3);</code>
<code>//带返回值</code>
<code>var</code> <code>sum=(</code><code>function</code><code>(x,y){</code>
<code> </code><code>return</code> <code>x+y;</code>
<code>console.log(sum);</code>
<code>~</code><code>function</code><code>(){</code>
<code> </code><code>var</code> <code>name=</code><code>'~'</code>
<code> </code><code>console.log(name);</code>
<code>}();</code>
<code>!</code><code>function</code><code>(){</code>
<code> </code><code>var</code> <code>name=</code><code>'!'</code>
<code>;(</code><code>function</code><code>(){</code>
<code> </code><code>var</code> <code>name=</code><code>';'</code>
<code>})();</code>
<code>-</code><code>function</code><code>(){</code>
<code> </code><code>var</code> <code>name=</code><code>'-'</code>
<code>//逗号运算符</code>
<code>1,</code><code>function</code><code>(){</code>
<code> </code><code>var</code> <code>name=</code><code>','</code><code>;</code>
<code>//异或</code>
<code>1^</code><code>function</code><code>(){</code>
<code> </code><code>var</code> <code>name=</code><code>'^'</code><code>;</code>
<code>//比较运算符</code>
<code>1></code><code>function</code><code>(){</code>
<code> </code><code>var</code> <code>name=</code><code>'>'</code><code>;</code>
<code>~+-!(</code><code>function</code><code>(){</code>
<code> </code><code>var</code> <code>name=</code><code>'~+-!'</code><code>;</code>
<code>~!(</code><code>function</code><code>(){</code>
<code> </code><code>var</code> <code>name=</code><code>'~!'</code><code>;</code>
<code>(</code><code>function</code><code>(){</code>
<code> </code><code>var</code> <code>name=</code><code>'call'</code><code>;</code>
<code>}).call();</code>
<code> </code><code>var</code> <code>name=</code><code>'apply'</code><code>;</code>
<code>}).apply();</code>
3.函数构造法,参数必须加引号
<code>var</code> <code>sum3=</code><code>new</code> <code>Function(</code><code>'n1'</code><code>,</code><code>'n2'</code><code>,</code><code>'return n1+n2'</code><code>);</code>
<code>console.log(sum3(2,3));</code><code>//5</code>
从技术角度讲,这是一个函数表达式。一般不推荐用这种方法定义函数,因为这种语法会导致解析两次代码(第一次是解析常规ECMAScript代码,第二次是解析传入构造函数中的字符串),从而影响性能。
<code>var</code> <code>name=</code><code>'haoxl'</code><code>;</code>
<code> </code><code>function</code> <code>fun(){</code>
<code> </code><code>var</code> <code>name=</code><code>'lili'</code><code>;</code>
<code> </code><code>return</code> <code>new</code> <code>Function(</code><code>'return name'</code><code>);</code><code>//不能获取局部变量</code>
<code> </code><code>}</code>
<code> </code><code>console.log(fun()());</code><code>//haoxl</code>
Function()构造函数每次执行时都会解析函数主体,并创建一个新的函数对象,所以当在一个循环或频繁执行的函数中调用Function()构造函数效率是非常低的。而函数字面量却不是每次遇到都会重新编译的,用Function()构造函数创建一个函数时并不遵循典型的作用域,它一直把它当作是顶级函数来执行。
内容转载至:http://www.jb51.net/article/80861.htm
本文转自 风雨萧条 博客,原文链接: http://blog.51cto.com/1095221645/1870031 如需转载请自行联系原作者