学习笔记2015-08-28

</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.οnmοusedοwn=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();


在这里可以看见,将函数赋值给变量irispolly,但是后者并没有带(),那么在这边iris和polly的区别在哪里?


其实polly就是 hi 函数本身,换句话说就是外层的function。polly()hi()的结果是一样的。

irishi()调用之后返回的那个东西,也就是说它是里层的那个匿名函数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
2
3
4
5
6
7
8
9
function  a(){
var  i=0;
function  b(){
alert(++i);
}
return  b;
}
var  c=a();
c();

特点

这段代码有两个特点:
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()”;


就到此为止。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值