IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

Zakas解答Baranovskiy的JavaScript小测试

Kejun's Blog 2010-04-15 13:45:23 累计浏览 3,309 次
本机暂存

    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. translateZ() (2026-06-25 21:18:56)
  2. translateY() (2026-06-25 21:17:56)
  3. translateX() (2026-06-25 21:16:01)

查看更多 前端 文章 →

建议继续学习

  1. JQuery实现Excel表格呈现 (累计阅读 48,350)
  2. 深入理解Javascript之执行上下文(Execution Context) (累计阅读 18,404)
  3. 从输入 URL 到页面加载完成的过程中都发生了什么事情? (累计阅读 15,933)
  4. 图片动态局部毛玻璃模糊效果的实现 (累计阅读 14,849)
  5. 天朝第二代身份证号码的验证机制 (累计阅读 14,762)
  6. HTML 5 的data-* 自定义属性 (累计阅读 14,349)
  7. 分享一个JQUERY颜色选择插件 (累计阅读 14,223)
  8. 什么是全栈工程师? (累计阅读 14,038)
  9. 快速排序(Quicksort)的Javascript实现 (累计阅读 11,735)
  10. 7 天打造前端性能监控系统 (累计阅读 11,187)