你自认为理解了JavaScript?

Email:longsu2010 at yeah dot net

CSDN论坛里有个帖子,“你自认为理解了JavaScript?”,Dmitry Baranovskiy在自己的博客里出了五道测试题,测试一下大家是否真的懂JavaScript。

建议大家去原帖看看。
题目如下:

if (!("a" in window)) {
    var a = 1;
}
alert(a);
var a = 1,
    b = function a(x) {
        x && a(--x);
    };
alert(a);
function a(x) {
    return x * 2;
}
var a;
alert(a);
function b(x, y, a) {
    arguments[2] = 10;
    alert(a);
}
b(1, 2, 3);
function a() {
    alert(this);
}
a.call(null);

虽然回帖中已经有正确解释了,但是我还是回了帖子,而且还引用了上一个人的回帖,之所以引用,我觉得要有知其然知其所以然的精神,更何况“授人以鱼不如授人以渔”

温馨提示,先自己作答再看答案呦!

我的回帖如下:

引用257楼u011295110的回复:
这几个问题都很棒,虽然不常见。其实都是在考对ecma-262是否了解,是否理解ecma-262原理。建议大家读一下emca-262标准。
官网为 http://www.ecma-international.org/publications/standards/Ecma-262.htm
中文版可以读 http://www.mojijs.com/2013/07/119399/index.html


第一题:答案undefined
if(!("a"inwindow)){
vara=1;
}
js函数正式执行前会先处理函数声明、形参、变量声明(创建变量但是不赋值,赋值在代码执行阶段)。本例先在代码执行前处理变量声明,也就是解析器先弄一个变量a,但是没到函数执行呢,还不能给他赋值。所以有了变量a, 注意是变量,全局变量相当于window的属性(其实不同,比如属性可以delete)所以"a"inwindow为true。
如果本题改为
if(!("a"inwindow)){
a=1;
}
将不会优先处理变量声明,结果会不同。
作为对比可以改为如下,同样根据上面的说明作答,大家自己试试。
(function(){
if(!("a"inwindow)){
vara=1;
}
alert(a);
})();

第二题:答案1
vara=1,
b=functiona(x){
x&&a(--x);
};
只要记住一点,命名函数表达式的名字仅在所定义的函数内有效,由ecmascript作用域链的构建规则决定。

第三题:答案是一个函数
functiona(x){
returnx*2;
}
vara;
按照第一题的解释中所说,先处理函数和声明和变量声明,所以a是一个函数,而vara不会改变赋值嘛,此后又没有赋值,所以a一直都是函数。

第四题:答案10
functionb(x,y,a){
arguments[2]=10;
alert(a);
}
b(1,2,3);
js每一个函数内都有一个隐含的arguments变量,是一个类数组结构,依次记录了参数的值,与参数同步更改。

第五题:答案window
functiona(){
alert(this);
}
a.call(null);
没啥可说的,默认用window。

忘说了,我觉得读ecmascript标准是学习最好的办法。
建议读英文,如果实在读不了读中文也会受益匪浅的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值