[TOC]
> JavaScript函數其三:分組中的函數表達式
**函數表達式和函數聲明**:
~~~
function foo(){} // 聲明,因為它是程序的一部分
var bar = function foo(){}; // 表達式,因為它是賦值表達式的一部分
~~~
**函數聲明會在代碼塊中被提到最前面**,而表達式不會。
~~~
alert(fn());
function fn() {
return 'Hello world!';
}
~~~
`()`是一個**分組操作符**,它的內部只能包含表達式,在使用`eval`對 JSON 進行執行的時候,JSON 字符串通常被包含在一個圓括號里`eval('(' + json + ')')`,這樣做的原因就是因為分組操作符,也就是這對括號,會讓解析器強制將JSON 的花括號解析成表達式而不是代碼塊。
**Module模式**
~~~
var Calculator = function (eq) {
//這里可以聲明私有成員
var eqCtl = document.getElementById(eq);
return {
// 暴露公開的成員
add: function (x, y) {
var val = x + y;
eqCtl.innerHTML = val;
}
};
};
var calculator = new Calculator('eq');
calculator.add(2, 2);
~~~
每次用的時候都要 new 一下,也就是說每個實例在內存里都是一份copy。
**匿名閉包**
~~~
(function () {
// ... 所有的變量和function都在這里聲明,并且作用域也只能在這個匿名閉包里
// ...但是這里的代碼依然可以訪問外部全局的對象
}());
~~~
對 module 進行擴展,添加新的屬性:
~~~
var module = (function(mod){
mod.moreFunc = function(){};
...
return mod
})(module || (module = {}))
~~~
若module已經存在,那么添加新的功能,若不存在,初始化為空對象再添加功能。
**克隆**
~~~
for (key in old) {
if (old.hasOwnProperty(key)) {
my[key] = old[key];
}
}
~~~
**function的執行**
在`function`后面加個`()`就能執行一個方法,但是有一個需要注意的地方:
```
function(){}()
```
該句會報錯,原因是方法是聲明式,所以不會生成一個有名字的對象來供`()`調用,但是用`()`包圍起來當作表達式就可以了:
```
(function(){})()
```
- 步入JavaScript的世界
- 二進制運算
- JavaScript 的版本是怎么回事?
- JavaScript和DOM的產生與發展
- DOM事件處理
- js的并行加載與順序執行
- 正則表達式
- 當遇上this時
- Javascript中apply、call、bind
- JavaScript的編譯過程與運行機制
- 執行上下文(Execution Context)
- javascript 作用域
- 分組中的函數表達式
- JS之constructor屬性
- Javascript 按位取反運算符 (~)
- EvenLoop 事件循環
- 異步編程
- JavaScript的九個思維導圖
- JavaScript奇淫技巧
- JavaScript:shim和polyfill
- ===值得關注的庫===
- ==文章==
- JavaScript框架
- Angular 1.x
- 啟動引導過程
- $scope作用域
- $q與promise
- ngRoute 和 ui-router
- 雙向數據綁定
- 規范和性能優化
- 自定義指令
- Angular 事件
- lodash
- Test