您的位置:首页 > 其它

学习笔记2015-08-28

2015-08-28 23:35 197 查看
</pre><pre name="code" class="javascript">
<pre name="code" class="javascript"><span style="font-family: Arial, Helvetica, sans-serif;">function drag(){</span>
var oTitle=getByClass('a','b')[0]; oTitle.onmousedown=fnDown;}function fnDown(){...}
今天在看书的时候,pollyu给我发来这一段代码,问我为何在onmousedown的右边,fnDown函数没有括号。我突然一愣,一时间也想不出合适的理由,我的第一回答是这样的:onmousedown是一个函数对吧潘卷卷  16:21:00是茶花烟  16:21:29好 现在有 onmd = func();和onmd = func;茶花烟  16:21:52func();是这个函数执行完的结果。茶花烟  16:22:00func是这个函数的名称茶花烟  16:22:29前者是调用onmousedown的时候返回func函数的返回值茶花烟  16:23:07后者是调用onmousedown的时候等同于调用了func()后来想想还是颇有偏差,所以在这边整理一下:看以下的实例代码
function hi(){  
  var a = 1;  
  return function(){
   console.log(a++);
  };  
};         
var iris = hi();
var polly = hi;
iris();
iris();
polly();
polly();
在这里可以看见,将函数赋值给变量iris和polly,但是后者并没有带(),那么在这边iris和polly的区别在哪里?其实polly就是hi 函数本身,换句话说就是外层的function。polly()和hi()的结果是一样的。而iris是hi()调用之后返回的那个东西,也就是说它是里层的那个匿名函数function,变量a时它闭包里面的一个对象。iris()的调用结果是console.log(a++);可以这样写两个等式iris =hi() = polly() iris() =console.log(a++) = hi()() = polly()()回到Hi()函数,hi()是把hi函数运行之后返回 function(){console.log(a++)},这种返回叫做函数式编程。hi函数包含了一个闭包,也就是说hi函数返回的function(){console.log(a++)}这个函数会一直保持着对a引用。闭包请戳我iris的值是hi(),也就是function(){console.log(a++)},而iris再次运行的话就会打印出来a的值,每调用一次iris,那么打印的值a就会加上1.polly的值就是hi函数,就只是一个普通的a = 1 的赋值操作。所以上面的代码返回 1,2,1,1.在这边引用一下百度百科中的例子在Javascript中闭包(Closure)什么是闭包“官方”的解释是:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。相信很少有人能直接看懂这句话,因为他描述的太学术。我想用如何在Javascript中创建一个闭包来告诉你什么是闭包,因为跳过闭包的创建过程直接理解闭包的定义是非常困难的。看下面这段

代码

特点

这段代码有两个特点:1、函数b嵌套在函数a内部;2、函数a返回函数b。这样在执行完var c=a( )后,变量c实际上是指向了函数b,再执行c( )后就会弹出一个窗口显示i的值(第一次为1)。这段代码其实就创建了一个闭包,为什么?因为函数a外的变量c引用了函数a内的函数b,就是说:当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。

作用

简而言之,闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。这是对闭包作用的非常直白的描述,不专业也不严谨,但大概意思就是这样,理解闭包需要循序渐进的过程。在上面的例子中,由于闭包的存在使得函数a返回后,a中的i始终存在,这样每次执行c(),i都是自加1后alert出i的值。那 么我们来想象另一种情况,如果a返回的不是函数b,情况就完全不同了。因为a执行完后,b没有被返回给a的外界,只是被a所引用,而此时a也只会被b引 用,因此函数a和b互相引用但又不被外界打扰(被外界引用),函数a和b就会被GC回收。(关于Javascript的垃圾回收机制请读者自行搜索)今天的笔记大概就是这么多。最后补充一点,这个是在javascript中的情况,在html中onmousedown的标准写法依旧是onmousedown = “javascript()”;就到此为止。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: