JavaScript函数部分补充
之前说了函数的调用,现在再来说说函数的另外几个重要概念:
闭包:函数内部可以访问函数外部的变量,函数外部不能访问函数外部的变量。为了打破这种“不公平”,就产生了闭包。
首先看一个简单的例子:
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();