以前说了函数的调用,如今再来讲说函数的另外几个重要概念:
闭包:函数内部能够访问函数外部的变量,函数外部不能访问函数外部的变量。为了打破这种“不公平”,就产生了闭包。
首先看一个简单的例子:
var fun1= function () {
var m=10;
var inFun= function () {
return m;
}
return inFun;
}
var f=fun1();
alert(f());
这就是一个最基本的闭包例子了,在这个例子中,闭包能够理解成为是java中的get函数,用来获得对象内部的属性的。
上面例子的另外一种变体是这样的,可是我我的不是很喜欢这么用。
var fun1= function () {
var m=10;
var inFun= function () {
alert(m);
}
inFun();
}
fun1();
由于容易写成这样子:
var fun1= function () {
var m=10;
var inFun= function () {
return m;
}
inFun();
}
alert(fun1());
可是,闭包除了上面例子的做用外,还有另外的功能,有时候咱们的要求老是会不少,除了访问外,咱们还但愿对函数内部的变量进行修改,再看下面的例子。
var fun1= function () {
var m=10;
var change= function (n) {
return m+=n;
}
return change;
}
var ch=fun1();//关键就在这里,调用fun1后函数已经结束,按照常理函数中的变量会随着函数的结束而不可访问
alert(ch(1));//可是在这里输出的是11
这就是闭包的另外一个做用,当调用原函数结束后还能够对函数内部的变量进行访问。由于函数内部的chage()被一个全局变量引用着,所以m并不会退出内存。
说完这个以后,不少还会再说内部函数的this做用域的问题,由于以前在函数的调用里面已经讲了,而且我的以为这与函数的闭包并无多大关系,只是闭包也是内部函数而已。所以这里就再也不说那点了。
回调:让人受不了的就是js的回调了,多层的嵌套会让代码彻底看不清楚。不知回调仍是“毁掉”,可是听说node.js中的异步回调函数正是其大放异彩的地方。有人说异步的代码是反人类的,可是同步的作事是否是也是反人类的。我想可能没人能受得了先吃饭再看电视而不是一边吃饭一边看电视吧。
模块:有时候有没有想过写js代码和java代码同样,可是js中没有类一说,做为补充提供了与之相似的模块化。
其实上面的闭包就有点像模块化了。下面咱们看一个更像java中类的模块化代码。
var model1=(function(){
var m=10;
var fun1= function () {
alert("我是fun1")
}
var fun2= function () {
alert("我是fun2")
}
return {
fun1:fun1,
fun2:fun2
}
})();
//在model1外部进行调用
model1.fun1();
动态的为model1增长方法:
var model1=(function(){
var m=10;
var fun1= function () {
alert("我是fun1")
}
var fun2= function () {
alert("我是fun2")
}
return {
fun1:fun1,
fun2:fun2
}
})();
//为model1增长方法fun3
var model2= (function (mod) {
mod.fun3=function(){
alert("我是fun3")
}
})(model1);
model1.fun3();