代码改变世界

javascript谜题

2010-02-21 16:48  BlueDream  阅读(389)  评论(0编辑  收藏  举报

又一JavaScript谜题.记录下.以及相关解答.

<script>
/*!
    1. (function(){  return typeof arguments; })();
*/
答案: "object".
解析: 没啥说的arguments类数组对象.本身类型就是Object的.

/*!
    2. var f = function g(){ return 23; }; typeof g();
*/
答案: Error(ECMAScript详见ECMA262第13章节NOTE部分 ).
解析: function两种形式:[1]函数声明 [2]函数表达式(或函数运算).显然这里是函数表达式. 这段代码就是:
      创建一个函数g并赋值给变量f. 这个函数g作为运算的时候可以当做匿名函数来对待.是不能通过名字访问到得(非ECMA例外).

/*!
    3. (function (x) { delete x; return x; })(1);
*/
答案: 1.
解析: arguments不能delete.但不产生错误异常. 所以delete x返回false.即 x没有被删除. 所以return x 为 1.

/*!
    4. var y = 1, x = y = typeof x; x;
*/
答案: 'undefined'.
解析: 没啥说的. = 运算顺序 由右至左. typeof x == 'undefined'.

/*!
    5.  (function f(f) { return typeof f(); })(function(){ return 1; });
*/
答案: 'number'.
解析: 我认为这道题考察点为当参数和函数重名时的优先级问题. 答案就是argument > function. 所以传入的函数return 1.
      typeof 1为'number'.

/*!
    6. var foo = { bar: function () { return this.baz; }, baz: 1 };
       (function () { return typeof arguments[0](); })(foo.bar);
*/
答案: 'undefined'.
解析: 考察了this. this是运行时属性.取决于运行时的环境而非声明时的环境. 这里当执行arguments[0]()时this指向的当前
      环境为argument. 所以argument.baz是undefined.

/*!
    7. var foo = { bar: function(){ return this.baz; }, baz: 1 };
       typeof (f = foo.bar)();
*/
答案: 'undefined'.
解析: 同6. f = foo.bar. 将其赋值给全局变量f.那么这时候的this就指向了window. window.baz也是undefined.

/*!
    8. var f = (function f() { return "1"; }, function g() { return 2; })();
    typeof f;
*/
答案: 'number'.
解析: 考察了逗号(,)作为运算符的作用.(返回最后一个表达式的运算值). 这里就是(function g(){})(); 返回的是2就是'number'.

/*!
    9. var x = 1; if (function f(){}) { x += typeof f; } x;
*/
答案: '1undefined'(ECMAScript).
解析: 原理同2题. 就是在ECMAScript中.函数作为运算表达式的时候是无法通过其名字访问的. 所以x += typeof f为'1undefined'.

/*!
    10. var x = [typeof x, typeof y][1]; typeof typeof x;
*/
答案: 'string'.
解析: 这个也很容易理解x = [,][1]; 即 x = typeof y = 'undefind'. 需要知道typeof 返回的是string类型就可以了 typeof typeof
      必然就是'string'了.

/*!
    11. (function (foo) { return typeof foo.bar; })({ foo: { bar: 1 } });
*/
答案: 'undefined'.
解析: 不知道这道题目的意义. 就是打马虎眼了. 传入的foo参数是个{ foo: { bar: 1 } }. 然后foo参数.bar当然没有了.

/*!
    12. (function f() {
          function f() { return 1; }
          return f();
          function f() { return 2; }
        })();
*/
答案: 2.
解析:  函数声明(区别var a = function函数表达式)
      会将他的scope提前.词法分析的时候 后一个f将前一个f覆盖了. 所以运行期的时候返回的是2.

/*!
    13. function f(){ return f; }
        new f() instanceof f;
*/
答案: false.
解析: new 的时候 如果constructor返回的是object或者function 那么就会覆盖原来的constructor. 所以typeof new f() 返回的是'function' 显然不能
      instanceof任何东西了.

/*!
    14. with (function (x, undefined) {}) { length; }
*/
答案: 2.
解析: 函数的length得到的是函数实名参数的个数. 这里一个x一个undefined就是2个.
</script>