IT技术博客大学习 共学习 共进步

Zakas解答Baranovskiy的JavaScript小测试

Kejun's Blog 2010-04-15 13:45:23 浏览 3,223 次

    Zakas 1/22在twitter上分享了Baranovskiy的一篇文章“So, you think you know JavaScript?”(你认为你够了解javascript吗)标题很叫板。结果5小段代码做的稀里哗啦。

    今天Zakas专门撰文解答了这几道题(http://www.nczonline.net/blog/2010/01/26/answering-baranovskiys-javascript-quiz/)。不愧是大师,很深刻。

    第1题: 是否真的理解声明变量

    if (!(”a” in window)) {

    var a = 1;

    }

    alert(a);

    知识点:一是变量声明和初始化是分开的。二是Javascript引擎仅仅是把变量的声明提到当前scope的最前面解释。三是所有全局变量都是window对象的成员。所以这段代码实际是:

    var a;

    if (!(”a” in window)) {

    a = 1;

    }

    alert(a);

    答案就很清楚了-‘undefined’。

    第2题:是否真的理解声明function

    var a = 1,

    b = function a(x) {

    x && a(-x);

    };

    alert(a);

    声明function只有两种一种是: function声明

    function a (x) {

    // do something.

    }

    另一种是: function表达式

    var a = function (x) {

    // do something.

    }

    function声明必须有方法名,而出现在表达式里的方法名都会被忽略。第二种function表达式就是一种赋值表达式,里面的方法名将被忽略。原文回复中提到的这篇文章(http://yura.thinkweb2.com/named-function-expressions/)写的很详细。

    第3题:是否理解function声明的优先级

    function a(x) {

    return x * 2;

    }

    var a;

    alert(a);

    function声明会覆盖掉同名的变量声明,无论变量声明在前还是在后。但当变量赋值后,function就无效了。如:

    var a = 1;

    function a(x) {

    return x * 2;

    }

    alert(a); //结果是 1

    第4题:考是否理解参数对象

    function b(x, y, a) {

    arguments[2] = 10;

    alert(a);

    }

    b(1, 2, 3);

    答案是10。arguments相当于对应x, y, a建立的副本,Javascript引擎实现它们对应的值同步。所以arguments[2]的值变化了,a也随之变化。

    第5题:是否真的理解call方法

    function a() {

    alert(this);

    }

    a.call(null);

    ECMA262第3版标准里有明确说明:

    “If thisArg is null or undefined, the called function is passed the global object as the this value. Otherwise, the called function is passed ToObject(thisArg) as the this value.”

    可见,如果call的第一个参数是null或undefined,被调用的function将被传入全局对像作为this。全局对象就是window对象。所以,这道题的答案就很清楚了。

    Zakas的原文更详细,我只是用更直白的话解读了一下。建议看原文。

建议继续学习

  1. web应用应该考虑的一些问题 (阅读 7,124)
  2. 总结的一些PHP开发中的tips (阅读 5,242)
  3. 产品经理3年沉淀和总结 (阅读 4,584)
  4. 我来CSDN的这一年 (阅读 4,404)
  5. 写在 0x20 岁之前 (阅读 3,581)
  6. 2009年年终盘点 (阅读 3,504)
  7. 界面程序开发的一些总结 (阅读 3,046)
  8. 无线产品团队总结 (阅读 3,045)
  9. 2010年过去了,我写篇日志留点印记 (阅读 2,485)
  10. 我的2010,2011 (阅读 2,182)