先给答案,在去测试。
一:undefined
解释,开始 a 为 undefined,但 undefined 当然存在于 window 中,So...
二:1
解释,方法a只能在a方法内使用a调用,即a(),其它域使用b(),以a作为b方法的方法名。
三:方法a
解释,var a; 仅是定义,并无赋值。
四:10
解释,输出arguments每个值都与参数有引用关系,以前无聊时测试过。
五:window
解释,a()/a.call()/a.call(null)无区别,经验。

解决方案 »

  1.   

    1.undefined
    2.1
    3.function a (x) {
        return x * 2;
    }
    4.10
    5.[Object window]这个还真不知道为什么
      

  2.   

    call是调用函数的意思吧,而且call还可以用来做继承。function Dog(color,age){
    Animal.call(this,color,age);
    }
      

  3.   

    1. undefined,a的定义会发生,但赋值不会
    2.不知,逗号表达式是顺序还是倒序执行没研究过
    3.function......
    4.3,因为a是值类型,不会影响参数变量a
    5.异常?调用null的toString方法应该会抛出异常吧
      

  4.   

    1. 因为预编译的原因所以 1代码等价于 
    var a ; 
    if (!("a" in window)) {
        a = 1;
    }
    alert (a);
    所以if语句判断通不过为 undefined
    2,不知道
    3,只知道JS对已经赋值过的变量再次定义无效,所以是function(){。。}
    4,第一直觉是10,不能确定,因为js所有函数在接受参数的时候实际就是arguments对象
    x,y,a 只是该对象的引用而已。
    5,不清楚,不过看了上面的恢复应该是this 就是a(); this就是window吧这个当记住了
      

  5.   

    求解 为什么第五个 结果是window而不是function a 
      

  6.   


    function a (x) {
        return x * 2;
    }
    var a = 10;
    alert (a);第三题改成这样是否可以测试预编译的时候是先function还是先var?
      

  7.   

    if (!("a" in window)) {
        var a = 1;
    }
    alert (a);这样的题目 见一次 喷一次
    这里的意思是判断 window中是否有属性 a?没有 则 在window下声明a(不知我理解的对不)
    所以 本身写的就是错误的代码 那要测试什么呢?对错误意思的错误理解?
    难道不应该这样写 if(!('a' in window)){ window['a'] = 1 } 
    错误的写法,不规范的写法,引起混乱的逻辑
    1,2,3,4 全是这样的类型
    这4个写法 生产环境中会碰见不?应该出现吗?只有 最后一题 还勉强算可以用来测试
      

  8.   

    拿第一题举个例子吧
    这个code其实会被这样执行
    var a;
    if(!('a' in window)) {
      a = 1;
    }
    alert(a);其实这些题目是否会出现实际生产过程中 我就不回答了,只是想说明下,这些题目本身只是一种测试 只是把问题极端化,边缘化。
      

  9.   

    喷是没必要喷的,你所认为的“不规范”,可能只是你没理解这种语言特性而已
    http://baike.baidu.com/view/648413.htm
      

  10.   

    其实我原先也不太理解闭包的概念,不过看过下面这段话,我算是有些理解了写过js的都知道,js中可以传递函数(以参数的方式),也是函数式的一种吧
    这样,上面的a就不要想成通常的变量,把它当成一个函数
    于是,很正常的出现了对闭包的需求:当一个函数被传出一个作用域以后,又没有事先声明(这种时候外面环境根本不知道传出来的是啥,不能事先声明),如果让这个函数可用?这就是所谓 闭包的价值 吧受益于楼主此贴的启发
    非常感谢。
      

  11.   

    第一题:if (!("a" in window)) {
        var a = 1;
    }
    alert (a);
    分析:首先会解析所有函数,其次是var声明的变量,但是不会赋值(明白?)。因为javascript没有块的概念。像for(var i in array)这里的i依然是全局变量。因此,这几行的代码执行顺序是:1.var a;//声明一个变量,但是不会赋值
        2.if语句,全局变量相当于window的属性,所以"a" in window为真,取反为假。故不会执行大括号里面的语句。
        3.alert(a);//undefined第二题:
         var a = 1,
         b = function a (x) {
            x && a (--x);
        };
        alert (a);
    分析:我们可以用多个逗号将变量分开定义,而是用一个var。函数表达式类似于局部变量,不会被全局作用域中访问到。
    执行顺序:
        1.声明两个变量var a,b;并给他们赋值a=1,b=function a(){...};这里的function a是局部变量,外部无法访问到。因此全局a还是1.
        2.alert(a);//1第三题:function a (x) {
               return x * 2;
            }
           var a;
           alert (a);
    分析:js永远是先解析声明式函数,再解析变量。
    执行顺序:
         1.解析函数a;
         2.声明变量var a;因为a此时没有被赋值,所以它还是指向原来的值。即function a;
         3.alert(a);//不言而预。第四题:function b (x, y, a) {
              arguments[2] = 10;
              alert (a);
           }
           b(1, 2, 3);
    分析:在函数内部可以引用一个对象,它是arguments类似数组,但不是数组。它代表了函数实际接收参数的集合。可以通过下标对相应参数进行访问。如果修改此对象某些属性,如arguments[index],则被传进来的第index(如果有的话,下标从0开始)变量的值也会被修改。
    执行顺序:1.声明一个函数b;
              2.执行函数b(1,2,3);因为这里arguments[2]与变量a引用的是一个值,所以当arguments[2]改变时,a也随之改变。第五题:function a () {
              alert (this);
           }
    a.call (null);
    分析:call方法接受多个参数,其作用是借用别人的方法当作自己的方法。这样能保证执行的时候this能够指向自己。call方法的第二个参数到最后一个参数是传给借用过来函数的。第一个参数是借用的对象,如果这个对象为空,那么将会作为全局window对象调用。即函数中的this指向window。
      

  12.   


    只能说你对js一点都不了解。用 var a申明的变量与window['a']是有区别的。前者不能用delete删除的,而后者可以。可能是先入为主的关系,很多人对js的弱类型以及它的解析方式不习惯不了解。还有很多人认为它不安全又简单,所以造成的误会很大。
      

  13.   

    虽然对js研究了2年多,正在研究一些js内部的详细东西,前面5个问题还是可以作对的,但是还是感觉有好多东西不了解。现在只知道:能用函数解决,就不要用对象;用对象解决就不要用继承。用到继承就要考虑对象之间的独立,共用等等。因为js的继承是实现继承,不像其他的
      

  14.   

    var a = 1,
        b = function a (x) {
            x && a (--x);
        };我且请教下各位
    上面的写法代表了 js的特性吗?
    你写出过这样的代码吗?
    你允许这样的代码吗?
    你的公司的生产环境允许这样的代码吗?如果没有 我干嘛要去理解
    我也不知道 我是不是理解闭包 理解什么特性   
    但是我们写代码更注重的是规范性 合理性 一致性
    一次性声明 
    预先初始化 
    正确使用
    及时释放
    这个是跨语言的形式把我们是要用我们的代码让世界更美好
    呵呵 上面都是乱说的(其实是赚更多的钱)写了几年代码 感觉自己开始胡言乱语了 大家可以更猛烈热情一点 js的时代就要来了
      

  15.   

    hoist;
    function expression;
    arguments;第5个不能简单的回答的,得看context,
    如果是 strict mode,那就alert null;考虑下面的代码:
    "use strict"
    function a(){
        alert(this);
    }
    a.call(null);
    如果不是 strict mode,那才this本身的指向。
      

  16.   

    最后一个问题, 当 this 的值为 null 时, 是没有意义的, 所以javascript会把它转換成为 Global Window 对象.
      

  17.   

    我是一个新手  学了不久  就蒙对了2个 第一题if(!('a' in window))我只是认为他是一个简单的字符s 所以为false, !false ==true,那么a=1了,
    第5个 我就认为null就是没有,所以因为a函数形式中并无上下文对象 没有就是引用global对象了,手册上讲的
      

  18.   

    最后一个问题,call()方法第一个参数是存放作用域(scope),
    如果在函数体外部调用call()方法,如果传入null则默认转成window,如果不传也是一样.
    由此推断call()方法内部构造类似如下代码:
    function call(scope) {
        if(!scope) {
            scope = window;
        }
    }
    把最后一片代码改一下就大致可以看出一些倪端
    function a () {
        alert (this === window);
    }alert(this === window); // true
    a.call (); // true
    a.call (null); // true
    a.call (this); // true
    a.call (window); // true
    a(); // truenew a(); // false
    如果new了一个函数,则函数体内的this就是它自身了
      

  19.   

    就是这个理,kk3k2005同学,请看 ILOVE_ASPNET 的回复
      

  20.   


    这个地方,不是测试谁先定义的问题吧?定义是按照顺序的啊。function 也是定义,var 也是定义。应该是顺序的。但是这地方,应该疑问点可能和java的定义和实例化有类似。var a,只是定义,但是并没有实例化,而如果a已经被定义过。二次定义,a的指针还是指向刚开始的function吧。我感觉这个问题要告诉我们的就是这个。
      

  21.   

    1.
    if (!("a" in window)) {
        var a = 1;
    }
    alert (a);js所谓的作用域只有函数,大括号({})不属于作用域。在执行JS的时候,会先预编译一下要执行JS的代码。因为变量a在下面已经定义了,所以"a" in window为true,加个非就为false,所以结果为undefined。等效代码。var a;
    if (!("a" in window)) {
        a = 1;
    }
    alert (a);2.Function
    3.undefined
    4.3
    5.window菜鸟默默的飘过