《JavaScript: The Good Parts》讲解闭包的章节中一处代码小错误

39页,给出了一个讲解闭包的代码:

var add_the_handlers=function(nodes){
var i;
for(i=0;i

这个函数的目的是: Make a function that assigns event handler functions to an array of nodes the right way. When you click on a node, an alert box will display the ordinal of the node.

但是代码中alert的却是'e',这个是event,如果是这样的话,点击每个节点,都是alert的 '[object MouseEvent]'
我们只要把alert(e)改为alert(i)就正确了,就可以alert出这个节点在所有选中的节点中的序数了。

javascript两种创建函数的方式的不同

javascript常见的两种创建function的方法是:

function testFunc(a){
    alert(a);
}

另外一种

var testFunc=function(a){
    alert(a);
}

对于第一种方式,当为创建全局执行环境而进行变量实例化时,会根据上面的函数声明创建相应的函数对象。

第二种方式,在全局执行环境的变量实例化过程中,会先为全局对象创建一个命名属性。而在计算赋值语句之前,暂时不会创建函数对象,也不会将该函数对象的引用指定给全局对象的命名属性。但是,最终还是会在全局执行环境中创建这个函数对象。

我们来看个例子来理解他们的不同

先看第一个例子:

testFunc('test');
function testFunc(a){
    alert(a);
}

在这种情况下,alert会执行,虽然函数定义在使用这个函数的代码之后,但是由于在创建全局执行环境的时候就会创建这个function,所以执行的时候是有效的,我们接着看这种情况

testFunc('test');
function testFunc(a){
    alert(a);
}

这种情况下,不会alert出’test’如果你有使用firebug等调试工具的话,会报错,提示testFunc不是个function。接着看:说明在执行 testFunc(‘test’)的时候,testFunc这个函数还被有被创建。

var testFunc=function(a){
    alert(a);
}
testFunc('test');

这种情况下,也会alert出’test’ 因为最终这个function还是会被创建,只是创建的时间和第一种函数创建方法不同而已。

javascript定义function在'}'后面的那个'()'的用处

javascript还有很多东西我还不太明白,现在正在努力学习中。

我们经常看到有些function定义最后面的’}’的后面加了'()’,以前一直不太明白这个括号是干什么用的。今晚看《javascript: the good part》,仔细看了一下,现在明白了。

javascript经常返回一个对象,例如:

var learn=function(){
return function(){
alert('test the ()')
}
};

执行learn() 后会返回一个function,内容就是那个alert()。如果我们只是这样定义,那么:

var learn=function(){
return function(){
alert('test the ()')
}
};
learn();

执行这段代码说明都不会发生,因为learn()只是返回了一个function而已,而并没有执行它。

执行 learn()();会alert出上面的数据,这也证实了learn返回的是一个function对象。

如果我们这样写:

var learn=function(){
return function(){
alert('test the ()')
}
}();
learn();

就会马上执行哪行alert代码,最后面的那个括号就是用来立即执行的。同时后面的那个括号还可以用来传递参数,例如:

var learn=function(value){
return function(){
alert(value)
}
}('test');
learn();

会alert出 ‘test’ ;

继续学习,还有很多地方不理解。

收到google wave邀请了

实际上已经收到3天了,但是这几天一直比较忙,没时间写日志。

初步体验感觉还不错,只是这个东西应该是需要学习一段时间才能掌握怎么使用,加上还是内测,还有很多东西都没开放。

而且在目前的这种硬件下,爆卡,google还需要进一步优化才行,或者要等硬件进一步升级,或者浏览器js引擎进一步快才行。

今天上午一个两个人的wave聊了一会儿后,就很卡很卡。对方和我都很卡。

这个东西确实很先进,只是出来后还是会比较小众吧,因为需要一定的时间学习摸索才行。

PS:现在我们这些刚被邀请进入的人还没邀请名额,所以邀请不了别人。

十一假期最后一天

今天基本是处于休息状态,看了两部电影,以及lie to me 第二集,然后还在网上游荡了很久。总之,很放松。

考虑了一下明天上班去要干的事情,那个项目要抓紧完成了,要抓紧写下去了,要不然越做越没兴趣了。不能拖久了。

另外开始看《javascript: the good parts》这本书里,刚看了一点点,还没什么特别的感受。

今天晚上开始熄灯了,不过对于我来说,无所谓,反正现在我基本上是按时作息了,只要白天能集中注意力干事情,比熬夜干事情要强多了,人要更有精神一些。

话说这段时间的事情可真是多啊,一方面要上班,然后还有好几个宣讲会,我都想去听一下。还要去找课程设计了,再不找,我怕就来不及了。

———————————————–分割线——————————————————

今天整理了一下找工作的事情,发现前段时间太混乱了,投了哪些公司我都不记得了,于是就想办法把这些东西都记录下来了,越来越喜欢web应用,就是用的Google Docs,这样,我在不同电脑上也可以方便的更新,查看了,因为白天基本都在公司。另外重要的事情还要配合Gmail的to do list以及手机的日程表功能,处于这种较忙的状态,像我这样的人,是很容易就把事情搞忘了的,上次创新学分的课就忘记选了。下周还要去找老师,看能不能加我个名额,囧啊。

十一假期第七天

早上看了会书,然后就出去去朋友那里,继续做饭吃,当然还是别人做,我什么都不会。不过他们的效率可真低,到下午两点多才吃到饭,饿死了。不过做的还算是美味。

下午就在那里打牌,运气一直很差,基本一直在输。

晚上回来继续书,老板还专门打电话来提醒我后天上班,其实我是记得的,后天后,要努力点,加快进度了,那个应用要尽快上线了,不能再这样下去了。

明天打算开始看看 js方面的了,为后天去的工作做准备,先想好怎么做,后天去了就直接写了。

马上十一假期就过完了,总的来说,还不错,但是,学习的东西没有达到预期,看来还是要提高一下效率,感觉目前的效率有点低,是要努力转变一些的时候了。

十一假期第六天

第六天已经过完了,假期很快就结束了,今天继续看 core python这本书,比较深入的理解了 mutable 和 immutable的type,相信这些对写代码会有很大的好处,了解了内部是怎么处理的,写起来就会更加明白自己的代码是在干什么了。

另外今晚去腐败了,几个朋友去买菜,然后在外面朋友租的房子里面烧菜,做饭,虽然我什么都不会做,但是参与了买菜,呵呵,就只会这个了,还是和别人一起去的。他们说明天还要腐败,看来是上瘾了,并且说明天要喝酒,我是真的不喜欢这东西,我喜欢我的大脑时刻保持清醒的状态。

————————————分割线——————————————————–

今天在twitter上看到已经有很多人收到了google wave的邀请邮件了,但是我还是没收到,我应该是已经被两个人邀请了,但是还是没见到邀请邮件,继续等啊,很期待这个东西,但是一直没见过它的真面目,不知道我要等到什么时候才能用上,希望google wave team快点啊。

十一假期第五天

今天有点开始浮躁了,看书效率有点低了,希望晚上好好休息一下,明天不要再这样。

今天继续看 core python programming这本书,看到了一个有意思的例子:

>>> True,False=False,True
>>> bool(True)
False
>>> bool(False)
True
>>>

出现这个的原因是True,False这两个Bool型的变量并不是python的保留关键字,我们可以用他们做变量名,当然实际应用中,估计没人写出这样的代码吧,这样写了后,到时候debug的时候估计会把人搞疯。

—————————————–分割线——————————————————-

好几天都没有去墙外看看了,只是自己太懒,前端时间好几个可以方便的跨越出去的东西都废了,但是很多技术文档还是在外面,不出去看不行啊。想到了很久以前架设的GAppProxy,去google group里看了一下,貌似可以看youtube了,去SVN里更新了最新的版本,更新到GAE,然后试了一下,看不了youtube,又自己到group里看了一下,原来是GUI的localProxy不支持,就直接去下载SVN里的localproxy源码了,也没去找说明文件,看到里面有个proxy.conf文件,我想应该是要设置这个,打开后看到设置fetch server的地方,取消注释,填上自己的fetch sever URL,然后运行 proxy.py,果然可以看youtube了,大喜啊,目前看来还是这个方法,还是这个方法稳定,方便。

配合Autp Proxy 使用更是有无墙的感觉,因为Auto Proxy这个东西,又把我拉到firefox的怀抱了,用chrome好久了,喜欢chrome的快速,但是也不能忽略了firefox的强大。