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

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

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

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

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

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

  • 相关阅读:
    初识spring
    关于导入别人的web项目,tomcat无法显示的问题
    doPost无法跳转显示信息,只能下载文件查看
    socket网络编程
    log日志文件
    第三方模块安装
    __name__ __doc__ __package__
    格式化
    导入模块
    python正则表达式补充
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3174583.html
Copyright © 2020-2023  润新知