10 09/2014

javascript quiz

最后更新: Wed Sep 10 2014 12:37:50 GMT+0800

javascript 测试题,来自 Baranovskiy’s JavaScript quiz

第一题

if (!("a" in window)) {
    var a = 1;
}
alert(a);
结果是: undefined
代码解读:如果没有 a 变量,则 a = 1 ### Why? 原因:var 变量声明会被提升到最前面。所以以上代码其实是
var a;
if (!("a" in window)) {
    a = 1;
}
alert(a);

延伸知识

  • 全局变量 var a=1 等同于 window.a=1
  • “a” in window 检测 window 是否包含叫 “a” 的变量
  • alert(“a” in window);var a; 会报告 true(变量声明会被提升)
  • var a=1 其实是两句话: var a;a=1;

第二题

var a = 1,
    b = function a(x) {
        x && a(--x);
    };
alert(a);
结果是: 1

代码解读:声明 a=1,b 是函数,函数名也叫 a,内容为 递归减一,然后与 x 逻辑与

Why?

原因:有名称的函数表达式,其名称只存在于函数内部。看看这篇 javascript function 的那些事,其它那些函数里面的定义都是打酱油的

延伸知识

  • function expressions 不会被 hoisted

第三题

function a(x) {
    return x * 2;
}
var a;
alert(a);
结果是: 函数定义本身

代码解读:先 声明函数 a,再 声明变量 a

Why?

原因:函数声明 优先于 变量声明

延伸知识

  • 函数声明(function declaration)会被提升(hoisting);和上面提到的 变量提升variable declaration hoisting 一个道理 function a(){} 等同于 var a=function(){} 并且被提升
  • 函数声明 优先于 变量声明,但不能优先于 变量初始化,如

      var value;
      function value(){
          return 1;
      }
      alert(typeof value);    //"function"
    
    结果是: “function”(函数声明 优先于 变量声明)
      var value=3;
      function value(){
          return 1;
      }
      alert(value); 
    
    结果是: 3(不能优先于 变量初始化)

第四题

function b(x, y, a) {
    arguments[2] = 10;
    alert(a);
}
b(1, 2, 3);
结果是: 10

代码解读:函数 b 有三个参数,第三个 永远是设置为 10,alert 第三个

Why?

原因:arguments 数组永远和参数串保持一致

延伸知识

其实 arguments 和 参数串 占用不同的内存空间。(The two memory spaces are kept synchronized by the JavaScript engine, which means that both arguments[2] and a contain the same value at all times.)

第五题

function a() {
    alert(this);
}
a.call(null);
结果是: window 对象

代码解读:定义函数 a alert this 变量,调用 a(无参数)

Why?

原因:函数 a 的当前 object 就是 window 对象

延伸知识

  • this(当前对象)返回的是 当前外面最近的 object 容器

      var object = {
        method: function() {
            alert(this === object);    //true
        }
      }
      object.method(); 
    
  • a.call( b ) 解读为: 在 b 对象执行 a 方法

      function method() {
          alert(this === window);
      }
      method();    //true
      method.call(document);   //false
    
    function write() {
          console.log(this);
      }
      write();
      write.call(document);
    
  • call(或者 apply)第一个参数为 null 或者 undefined 的话,该方法对 向上找到全局对象 执行该方法

    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.

原文来自 Answering Baranovskiy’s JavaScript quiz