js函数作用域和对象作用域里变量的不同

2013-3-3 评论(8) 分类:技术文章 Tags:

写js时碰到一个坑,查了半天简化后问题是这样的:

<script>
  alert(document) //[object HTMLDocument]
  var document
</script>

<script>
  (function(){
    alert(document) //undefined
    var document
  })()
</script>

在全局作用域上document没变,但在函数作用域上执行后document变undefined了。来看看这两种情况下都发生了什么事。

函数作用域

在函数作用域上这样的结果虽然难发现,但容易理解,var是声明局部变量,js在函数执行之前会把作用域内所有用var声明抽到头部统一生成,就是说

(function(){
  alert(document)
  var document
})
//等价于
(function(){
  var document
  alert(document)
})

在执行alert(document)访问document变量时,先从当前作用域寻找这个变量,如果当前作用域没有这个变量,会通过作用域链一层层往上寻找。若没有var document,就会找到上层的window.document。在这里当前作用域声明了document这个变量,优先访问这个变量,因为这个变量只声明未赋值,此时document==undefined。

在函数作用域下是这样的,但全局作用域下就不同了。

对象作用域

先看看raphelguo提供的的例子:

var obj = {a : 1}
with (obj) {
  var a = 2
}
alert(obj.a) //2
with (obj) {
  a = 5
}
alert(obj.a) //5

可以看到在obj作用域下,var变量声明已经失去了作用,无论有没有用var声明变量,对变量赋值都是等价于对当前obj的属性赋值。换句话说var是用来声明局部变量的,但在对象作用域内并没有地方存储局部变量,所以var是无效的。

再回来看看最初的例子,就很容易理解了,浏览器上在全局作用域下等价于在window这个对象下执行代码:

with(window) {
  alert(document)
  var document
}

这时var document完全无作用,alert出来的自然是window.document了。

看来,js的变量不是存在函数里,就是存在对象(包括宿主对象如window)里,要区分这两种情况的不同避免遇到坑。

博客换肤

2013-2-27 评论(5) 分类:懒得分类

09年博客从闪吧迁移过来时做了个主题皮肤,到现在4年了一直没有换,这两年动过几次想换个简洁主题的念头,却因为懒一直没行动,这次照常动念头,但行动了。

看别人的博客时很喜欢那种整个页面很清净简洁的设计,可惜我搜了很多wordpress的主题都没有这样的主题可用,只能自己做个了,去掉了一些多余的东西,满意程度一般。

因为页面简单,所以可以简单支持根据页面宽度自适应的方式,粗略的响应式设计。这样做的好处是我不用给移动端浏览器另写一套CSS了,宽窄屏幕都适用。在PC上可以缩窄浏览器宽度看效果。

缅怀逝去的旧博客主题:

blog

春节见闻

2013-2-17 评论(2) 分类:生活

今年过了一个忙碌的春节,家里比往年热闹,陆续不断有人来家里作客,我也跟不少同学聚会,连着五六天没一天空闲,但忙并快乐着,家里热热闹闹的显得兴旺,跟同学聚会聊天也是十分快意,过了这些天以后我发现快乐的时间过得快这话不准确,这个春节感觉过得挺慢。多样的生活让时间变慢,规律重复的生活让时间变快。

今年很喜欢在客厅听爸妈的朋友们叙事,多了解不同人的生活情况,几家欢喜几家愁,愁的人比较多,生意普遍不是很好,有人转为卖鱼维生,每天早上从家乡买鱼通过客车运到惠州卖,能賺几百过活。生意机会虽多,但门路难摸。有看到两口子打工过活虽辛苦但温馨,也有因为无钱买房而断绝几年感情的情侣。看到老实勤勉又不迂腐的人,就很有好感,年近者当朋友,年长者尊敬之。

对于春节亲戚朋友的各种问题,我受到的困扰较少,很少人问,有的话就是问一个月賺多少钱,此时祭出杀手锏:够生活够生活。答了等于没答,对于普通人这样就够了。真的很有兴趣知道的,说了也无妨。工作后的赚多少钱跟读书时的分数一模一样,给人一个标签,差生,普通生,优等生,高材生。大家对于这样的问题反感主要是有的人会把你的回答跟他们自己或儿女对比,从而产生优越或自卑的感觉,只要能感觉到他们没这样的意思,就是善意的,往好想是关心你过得好不好,往不好想也只不过是好奇心和拉家常。

初五第一次去女朋友家,无压力,不紧张,不过因为潮汕话口音不同,交流起来比较吃力,餐桌上把咸听成了少,闹了笑话,其他时候也常听不懂说什么,所以对方一开口我就要注意力十二分集中,这点有点辛苦,有时转说普通话才有所好转。

生平第一次接触到一个炫富的人,在淘宝卖衣服发家致富的女生,年龄很小,嚣张无礼貌,面对一群父辈气势凌人,吹嘘浮夸,时时炫富,不知怎么说好,说人家穷得只剩钱会有人觉得这是吃不到葡萄,总之希望不要跟这类人有任何联系。面对别人有物质财富,常常以精神财富聊以安慰,但我发现精神财富也所剩不多,就圈子里的人谈理想谈改变世界谈活得有意义的很多,但真正实践了还是怎么来钱快怎么干,虽然不至于唯钱是论,但还是围着它转,想想正是因为这样,才会这么在意这些炫富的人。

春节期间整个人处于移动状态,好友从Q群转移到微信群,所以使用微信多了,使用过程中最烦的就是播放语音时听筒模式的切换,普通切换方式是检测到手机贴住脸就自动切换到听筒模式了,微信还加了一个条件,就是除了遮住脸,还要有举起手机的动作。导致有时想切换听筒模式时不灵,把声音公放出来了,在有旁人的情况下引来目光。我想不到这样的设计相对于普通方式有什么必要和好处,无非就是跟人演示的时候说,看,手盖上去它是不会切换听筒模式的,它能识别耳朵!厉害吧?画蛇添足的感觉。

不过以上这点小小的问题根本无关紧要,有的地方精雕细琢,有的地方粗燥随便,这些都完全不影响一个APP的兴衰,过年时看到有人用微信就随口问为什么不用QQ而用微信,得到的答案大多是:可以语音,潮流。QQ也可以语音但不保证每个收到的人都能听到,大家都在用,新潮,用QQ有落伍的感觉。语音的功劳很大,talkbox这个创新很了不起。当然凭微信现在大而全的形态,很多其他功能也是使用的原因之一。

[node.js]RPC(远程过程调用)的实现原理

2013-1-31 评论(0) 分类:技术文章 Tags:

刚接触到RPC(远程过程调用),就是可以在本地调用远程机子上的程序的方法,看到一个简单的nodejs实现,用来学习RPC的原理很不错:nodejs light_rpc

使用示例:

//服务端
var light_rpc = require('./index.js');
var port = 5556;
var rpc = new light_rpc({
    combine: function(a, b, callback){
        callback(a + b);
    },
    multiply: function(t, cb){
        cb(t*2);
    }
}).listen(port);
Sample client:
//客户端
rpc.connect(5556, 'localhost', function(remote, conn){
    remote.combine(1, 2, function(res){
        if(res != 3){
            console.log('ERROR', res);
        }
    });
});

(更多…)

资源

2013-1-29 评论(3) 分类:随记

在大学里我没有意识到资源的存在,进入社会一年多来发现资源无处不在,在商业社会里一个人的强大除了自身实力外,还要看他掌握的资源,有资源才可以做事情。

淘宝的人出来做了蘑菇街,因为他们有各种电商的资源,包括熟悉这块业务的技术人员、对淘宝核心数据的了解、电商各种合作伙伴的人脉,淘宝内部人员的人脉等。

网易游戏的人出来做游戏,因为有很多游戏相关的资源,包括技术人员、玩家的数据、推广渠道。他们有很多人民币玩家的数据,直接向他们推广游戏,减少很多推广的成本,同时也熟知如何在其他渠道推广游戏。

在公司里做一件事同样需要很多资源,公司可以分派多少人力资源给你完成这件事,其他能部门提供多少帮助,你旗下的产品也是你的资源,例如微信刚开始时,最大的资源是QQ邮箱,因为微信团队之前是做QQ邮箱的,在邮箱上放广告条推微信,到了现在整个腾讯都是微信的资源。

作为自有撰稿人,跟出版社/编辑的联系是资源。作为独立开发者,拥有的资源包括对外的名声、已有的产品、客户等等,对外的名声带来客户,已有的产品可以帮助推广新产品。要是在政府做事情,或做政府的生意,几乎全靠人脉资源,显而易见,你懂的。

只要在社会上混,一定会有资源在身边出现,就算是公司很小的职员也可以获得很多资源,特别是信息资源,例如在外企当助理,可以知道在公司在各个流程上对各种合作商的要求和挑选方式,如果公司是跟服饰相关的,可以拥有服装厂方面的资源,认识里面的人,对他们生产销售的了解,如果是跟超市相关的,可以知道超市运作方式,寻求合作的门路。这些储备资源很可能某一天用处很大。

社会上很多行业是比较封闭的,如果没有入行就没有门路,没有这个行业的资源就很难做这行业的事,互联网行业会逐渐跟很多其他行业建立联系,会有非常多的跨行业合作机会,拥有两个行业的资源的人,就可以在两个行业的联系中找到机会,拥有的资源越多,做事的机会越多。