1.函数
定义函数的方法有两种
,一种是
函数声明
,另一种是
函数表达式
.
//函数声明
function f1(){}
//函数表达式
var f1=function(){}
这两者的区别在于:函数声明会在所有代码执行前进行解析,而函数表达式和声明变量一样都是执行到这里的时候才进行解析。(看例子)
f1()
var f1=function(){
console.log(1)
}
Uncaught TypeError: f1 is not a function(…)
f1()//输出结果1
function f1(){
console.log(1)
}
2.闭包
闭包就是能够读取其他函数作用域中的变量的函数。我们常见的闭包就是在一个函数中创建另外一个函数。(看例子)
//例子1
var f1=function(){
var a=0;
return function(){
return a++;
}
}()
console.log(f1()) //输出0
console.log(f1()) //输出1
上面函数就是一个简单的闭包。 (再看一个例子)
//例子2
var f1=function(){
var a=0;
return function(){
return a++;
}
}
console.log(f1()()) //输出0
console.log(f1()()) //输出0
咦,是不有有点奇怪,看起来相同的两个例子会输出不同的结果?(让我们再看两个例子)
</pre><pre name="code" class="javascript">//例子3
var f1=function(){
var a=0;
console.log(123)
return function(){
return a++;
}
}()
console.log(f1())
console.log(f1())
//打印 123 0 1
</pre><pre name="code" class="javascript">
//例子4
var f1=function(){
var a=0;
console.log(123)
return function(){
return a++;
}
}
console.log(f1()())
console.log(f1()())
//打印 123 0 123 0
我们来解析一下:这两个例子中,例子3 因为在声明函数f1的时候已经自己执行了一次,所以我们可以把例子3看成:
</pre><pre name="code" class="javascript">var f1=function(){
return a++;
}
//因为自动执行了一次,所以打印123 a是能访问外面的a, a此时为0
console.log(f1()) //打印 0
//调用的时候并没有打印 123,所以也没执行 var a=0; 此时 a=1
console.log(f1()) //打印 1
//我们可以看出 a一直存在局部变量中,并没有被回收
/*为什么没被回收呢?因为父函数在执行后子函数被赋给了一个全局变量,
而子函数是依附父函数的,所以就算之后没执行父函数,父函数也会存在内存中,
不会被回收
*/
</pre><pre>
怎么样,是不是知道这两个例子为什么打印的东西不一样了吧!!!!!是不是对闭包有点理解了~~