快速业务通道

Javascript教程:关于深入了解JS的几个问题

作者 佚名技术 来源 网页制作 浏览 发布时间 2012-03-06

看了Dmitry Baranovskiy写的这篇So, you think you know JavaScript?,也拜读了Nicholas C. Zakas的答复,对Javascript的了解又进了一步,尝试把自己的理解记录如下
第一题:

DaimaRen.cn © 2009-2010 by Tomie Zhang
if (!("a" in window)) {
    var a = 1;
}
alert(a);

这一题是对JS变量的考察,这个测试翻译成自然语言大意是:如果window里不存在a这个属性,那么就定义个a的变量并给它赋值等于1。 这里本来期望的值是1,但是很可惜它会弹出”undefined”,这是为什么呢?首先javascript的全局变量都是window的属性(properties),你可以用形如:

DaimaRen.cn © 2009-2010 by Tomie Zhang
alert("Daimaren.cn" in winodw)

来查看,var a = 1 等同于 window.a = 1,其次javascript引擎在扫描代码时是将变量提前到scope之前运行,如:

DaimaRen.cn © 2009-2010 by Tomie Zhang
alert("a" in window);
var a;

其实在解析之后是

DaimaRen.cn © 2009-2010 by Tomie Zhang
var a;
alert("a" in window);

所以它的结果是true,最后javascript的声明与初始化是分开的,

DaimaRen.cn © 2009-2010 by Tomie Zhang
var a = 1;
/*其实在运行时将变为*/
var a;
a=1;

javascript会自动将这两个步骤分拆,Nicholas的解释是这种分拆可以让声明前置在scope上方,而为什么要这么做,是因为声明时就初始化变量,可能影响代码运行时变量的值,导致意外的结果。
so,知道了这些,那么开始那个测试其实在运行时会是这个样子:

DaimaRen.cn © 2009-2010 by Tomie Zhang
var a;//自动前置运行的变量,没有初始化
if (!("a" in window)) {//FLASE
    var a = 1;
}
alert(a);//弹出undefined

第二题:

DaimaRen.cn © 2009-2010 by Tomie Zhang
var a = 1,
b = function a(x) {
        x && a(--x);
};
alert(a);

如果理解上第一题,那这个题就很好解决了,这是关于function的,它有2种,一种是函数声明(function declaration),一种是函数表达式(function expression),形如:

DaimaRen.cn © 2009-2010 by Tomie Zhang
function Daimaren(){//这是一个函数声明
  do anything you want here........
}
var Daimaren = function(){//这是一个函数表达式
  do anything you want here........
}

所有的函数声明在运行时是会被前

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号