感觉还算是比较正式的,虽然之前通知的是第xx组,但预想中的群面并没有出现,也许技术职位的面试还是单个考察更为妥当吧。两个组一共四轮面试,把我折腾得死去活来,揪着简历里面的细节问这问那,时不时让我冷汗直冒。最惨的就是某组一面的面试官问的算法了,两道(在CS学生看来应该算是)很简单的题,一道排序题我东扯西扯想转移话题但终究被伊识破说你还是说不清楚呀,另一道好像更白痴的递归算法题我写了半天也被伊无情鄙视说你这又是何必呢这样这样不就完了吗?弄得我很不自然,于是让我提问时我就反问你为什么要考我算法?我认为我申请的那些职位更需要关注的是不是这些比较底层的东西吧?而且我对算法一没兴趣二也没准备。不过他还是很厚道的放我进二面了。另一个很让我ft的问题是关于javascript的,这个暂且不表。

除此之外整个过程还是比较轻松愉快的,我所擅长的技术以及我对自己的一些积极评价都比较充分的展示给了面试官,我觉得这应该能使他们忽略掉我犯的那些小错误 ;) 当然我也不能确定告别时他们那些美妙的言辞是不是发自内心的;工作了的同学都说社会黑暗、职场无情,虽然我已不像往日般纯情,但毕竟缺少生活体验,期盼在日后的“人生道路”上能多栽几个跟头。

ps., 这两天北京真是太热了,好无奈啊 :cry:

无情的分割线来了,下面我要写一些关于javascript的东西。

一面web2.0组时(长见识了,这个词要念歪脖吐呕)被要求解释javascript中的闭包,问了我一个措手不及。我说您是指closure吗?伊答然。在我的印象中闭包这个词仅出现在java7的一个JSR中,据说各路神仙提议把它作为新特性加入下一代java语言,看来看新闻只看标题是一个很不好的习惯。回来马上google了一下,第一条就是这篇05年的文章,读罢全文之后终于算是大概了解了这个概念,越发觉得javascript是个无底洞了。据说闭包突出体现了functional programming的特性,真是深奥啊。

记得在看犀牛书时提到了一个Lexical Scoping的概念,不过上面只是将其作为javascript的一个高级话题粗粗带过,要仔细说起来,其实是这样的:

在javascript中,一个函数被调用时会生成一个新的execution context ,之后以下事件依次发生:

  1. 一个Activation对象(ActObj)被生成(其实并不算是一个真正意义上的对象,因为它没有prototype),但是我们无法从代码中直接引用它;
  2. arguments 对象被生成,通过Activation对象的arguments属性可以引用它。这就解释了函数体内为何可以使用arguments这么一个变量,不要看它在函数体内没有被声明就以为他是全局对象的变量,这个后面说说scope就清楚了。
  3. 接着scope就被组装起来了,按下不表;
  4. 这一步进行变量实例化,依次是参数、内部函数和局部变量(局部变量在这里仅是初始化为undefined,赋值语句在执行时才起作用)。这些是创建在一个Variable对象上的(ECMA的规范),但其实在实现中它跟Activation对象是一个东西。
  5. 为this赋值
回头说刚才提到的scope。其实这个我们都很熟悉,查找变量是当然是从局部到整体一个一个往上找(包括每个对象的prototype链)了,而在一个函数体内的查找顺序就是ActObj->GlobalObj,所以在查找arguments的时候一定会在函数的ActObj中找到。而函数闭包正是利用了这个scope,通过在函数内内嵌函数来达到保留父函数的execution context的目的(这里还利用了GC的特性,虽然外层函数返回了,但由于内层函数仍被引用,所以外层函数的那些变量才不会被收垃圾的捡走)。这让我想起了做毕设时候的一个问题,代码如下:
if(Element.hasClassName(tr, "sell_tr") || Element.hasClassName(tr, "buy_tr")){

oc=Element.getStyle(tr,“background-color”);

//tr.oc=Element.getStyle(tr,“background-color”);

Event.observe(tr, “mouseover”, (function(){

  this.style.backgroundColor='#fff';

}).bind(tr)

);

Event.observe(tr, “mouseout”, (function(){

  this.style.backgroundColor=(oc/*this.oc*/ || '#fff');

}).bind(tr)

);

}

可以看出这样并不会产生预期的结果;鼠标滑开之后表格行会变成同样一种颜色——也就是oc最后被赋的那个值;原因就是闭包,在返回的那个内嵌函数中,scope是innerFuncActObj->outterFuncActObj->GlobalObj,而oc停留在最后一次赋值了(好比是一个快照),当时我使用了被注释掉的相应语句,现在想想才恍然大悟。

真的好神奇啊,更多的例子可以看那篇文章,老外真是诲人不倦啊,甚善 :-D


历史评论

Joeey
Joeey (2007-06-09)
是十八摸吧?
twenty
twenty (2007-06-10)
太深奥了,幸好我不是编程的,要不看见了肯定觉得自己那简直是×××× :evil:
lm
lm (2007-06-10)
没地方能看懂的…… 哪个公司?
mavis
mavis (2007-06-13)
太复杂了。