声明
和调用
。function makeCounter() { // 只能在makeCounter内部访问i var i = 0; return function () { console.log(++i); }; } // 注意,counter和counter2是不一样的实例,分别有本身范围内的i。 var counter = makeCounter(); counter(); // logs: 1 counter(); // logs: 2 var counter2 = makeCounter(); counter2(); // logs: 1 counter2(); // logs: 2
声明了makeCounter函数
,该函数中定义了局部变量i
,返回值是一个函数
,这里要注意的是一个函数的声明
;表达式的方式
建立实例,将makeCounter函数的执行结果
赋给变量counter
,此时counter获得的是makeCounter的返回值
,即function () {console.log(++i);}
;counter()
表达式中,()
的做用就是用于执行function () {console.log(++i);}
,在控制台中打印出结果。counter
是一个标识符
,就是属于原始表达式;function(){}
只是一个函数声明,不属于表达式,所以,在其后面加上()
,并非当即调用函数表达式;function fn(){}
,即便在后面加上()
,也没法实现当即执行效果,它一样只是一个函数声明,不属于表达式
。var counter2 = makeCounter();
在标识符counter2后面加上()
,才是对其进行调用。把函数声明变为表达式
,如何转换呢?// 下面2个括弧()都会当即执行 (function () { /* code */ } ()); // 推荐使用这个 (function () { /* code */ })(); // 可是这个也是能够用的
小括号()
的做用,()
除了做为分组运算符应用于数学运算外,在js中,它还有个重要的做用,就是用于区分一个代码是函数声明仍是函数表达式
,见下面代码:function func(){};//函数声明方式 (function func(){})//函数表达式方式
结合这段代码和上面的代码,咱们就能够清楚的看出,()在代码中的做用,就是将函数声明转换为函数表达式
,这就解答了咱们上述5中的问题。javascript
eval()
方法的使用。该方法的一个经常使用的应用场景,就是使用eval()函数将json格式字符串转换为对象
的时候,须要多嵌套一层小括号。