[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