第一题:
if (!("a" in window)) {
    var a = 1;
}
alert(a);
第二题:
var a = 1,
    b = function a(x) {
        x && a(--x);
    };
alert(a);第三题:
function a(x) {
    return x * 2;
}
var a;
alert(a);
第四题:
function a() {
    alert(this);
}
a.call(null);
以上弹出的对话框的内容是什么?

解决方案 »

  1.   

    第一题考的是什么? "a"是个常量 "a" in window永远是true。所以不会进if里面 所以a肯定是undefined
    第二题考的是匿名函数问题,其实这个function a(){}是个幌子,答案是1
    第三题考的是js的处理顺序 答案是打印出这个函数本身
    第四题考的是可以说是上下文的问题 答案是window
      

  2.   

    补充下 某些浏览器下 最后一题的答案是object 但是其实这个object就是window
      

  3.   

    第1题
    在执行钱  会对所有的全局变量检测 并给值undefined
    所以 已经有了 window.a
    'a' in widnow 为true  'a' in widnow为false2
    在执行js执行  函数会提前定义
    所以是先有的 函数function a(){}
    然后才重新定义的a3
    不知道问的是什么
    以前面试做过
    做错了4
    null调用 任何函数
    函数里面的this 都指向window
    我一直是这么理解的
      

  4.   

    第1题
    在执行钱 会对所有的全局变量检测 并给值undefined
    所以 已经有了 window.a
    'a' in widnow 为true  ! 'a' in widnow为false
      

  5.   


    额,不是说你不知道in的意思,‘a’当然是个常量字符串, 'a' in window就是检测window中是否有a这个属性,你并没有解释为什么 'a' in window为什么是true; 5楼所给的第一题解释个人觉得也挺牵强,什么是全局变量检测? 如果第一题的条件判断语句改成 if('b' in window)呢? 结果又会是怎么样?第一题考察的是,js引擎对var关键字的解析: js引擎首先会对所有var 后面的变量做一个声明,即题目中var a = 1;这个语句, js会拆分成这样:  var a;
      if (!("a" in window)) {
           a = 1;
       }
    alert(a);
    我们知道声明一个变量,没初始化的话,就是undefined,所以显示undefined, 如果没申明变量,直接alert的话,是会出错的对吧? 
      

  6.   

    再来两题好了:unction value(){
        return 1;
    }
    var value;
    alert(typeof value); function value(){
        return 1;
    }
    var value = 1;
    alert(typeof value); 
      

  7.   

    第一题的解释补充下, 声明的变量是被加到最近的环境作用域,因为是在全局执行的,所以a的声明是在全局作用域下, 新增加的2题可以很好的帮我们理解var关键字和function关键字的解析顺序,以及声明和定义,还有初始化的关系。
      

  8.   

    第一题考察的是,js引擎对var关键字的解析: js引擎首先会对所有var 后面的变量做一个声明,即题目中var a = 1;这个语句, js会拆分成这样:  var a;
      if (!("a" in window)) {
      a = 1;
      }
    alert(a);你说的没错,'a'这个字符串常量对应window['a']这个属性。也就是全局变量(window属性)不假
    同时你在if() {
    }
    里声明和赋值也不假但是由于js没有这个块作用域,所以线程栈上会先遍历全局变量的声明。
    如果说是考察对js的变量解析的话,那么function也算是全局属性的特征。即,var 也好 function也好 都是优先加载 而赋值语句(包括未加var的声明语句)的都是执行到了才执行。你的拆分理解上没问题,但是感觉出题有点牵强吧
      

  9.   

    js的解析过程是
    var 预加载
    function  预加载
    顺序执行
      

  10.   

    如果再细分点
    function()内部也有个预加载过程 即在function第一次调用的时候 里面的执行顺序也是var 预加载
    function 预加载
    顺序执行。
      

  11.   

    恩  
    我不对
    我只是说了自己的理解  而且说的不严谨
    且我没拿出证据不过lz也一样 只是说了自己的理解  没拿出证据
      
    http://bbs.51js.com/viewthread.php?tid=82591ps 这些与js牛不牛没关系  
    自己学了这部分就知道  不学究不知道  学了但是很久没看了 也可能会不记得在ps  有几个问题问下lz 
    解释的时候 麻烦给出相关链接
    也可以不给出  
    function x(a){
    delete a
    return a
    }
    x({c:'c'});
    a是什么
        var foo = { 
          bar: function() { return this.baz; }, 
          baz: 1
        };
        (function(){ 
          return typeof arguments[0]();
        })(foo.bar);
    返回的什么值
      

  12.   

    深入的看下ecmascript specification 3里面的详细内容,其实都很容易理解
      

  13.   

    桃子引用的是玉伯2年多前发的帖子吧你出的题,似乎第一题出的和意图不对吧,总之没看到想考察什么
    第二个似乎是在考察对象字面量和“类对象”中对this的区别。楼主的标题确实让人有点,
      

  14.   

    第一题是 
    ecmascript 
    里面专门有介绍  看看对ecmascript 了解不 
    ( 当然不知道  也不能说明你对ecmascript 不了解  看了很多  没有注意arguments这部分也很正常)第2题里面有
    陷阱
    我之前做的时候做错了
    之前飞之石版主也是拿这个题做解释
    其实他也解释错了 
    见 http://topic.csdn.net/u/20101225/14/8c34eb94-0de3-45de-91a9-8f24ba103c46.html?75332
    我是想拿来 看看lz是不是那种很严谨的人
      

  15.   

    其实第一题涉及到一个delete的作用的一个问题
    delete只能删除属性。所以 如果你传个参数进来的话 即使不考虑arguments 也会无效的
      

  16.   

    第二题我的解释或许是不严谨的,我的表达能力一直都是很欠缺的,但是我相信无论是我还是风之石,理解上应该是没有什么偏差的。ecmascript 中的很多东西说实话区别在于知道与否,当然这样和js的基础有着息息相关的联系。我自认菜鸟一枚,所以风之石当时(他自己的博客,非发到csdn上的)出的题以及对ecmascript 做翻译让我开始重视文档,在略略看完之后更加茫然。就目前的情况来看,应用js的人大多数没留意过这些,楼主的题目出的有好处,起码能引起别人的重视,但是标题着实让我难堪。
      

  17.   

    第2题
    风之石解释是正确的  我们都像他学习
    但是例子真弄错了6.
        var foo = { 
          bar: function() { return this.baz; }, 
          baz: 1
        };
        (function(){ 
          return typeof arguments[0]();
        })(foo.bar);A “undefined”B “object”C “number”D “function”  答案为:Athis的标识问题,注意arguments[0]();其实就是要去执行function() { return this.baz; },此时,this为global Object,即window,而window上木有baz属性或变量。  var bar =123;
       var foo = { 
          bar: function() { return this.baz; }, 
          baz: 1
        };
        (function(){ 
          return typeof arguments[0]();  //这里还是undefined
        })(foo.bar);因为在返回那个地方用的是arguments[0]()
    arguments的0属性的方法    this 指向的是arguments   var foo = { 
          bar: function() { return this.baz; }, 
          baz: 1
        };
        (function(){
    arguments.baz=123 
          alert(typeof arguments[0]());  
        })(foo.bar);其实这样才是风之石的本意
    var baz=3
       var foo = { 
          bar: function() { return this.baz; }, 
          baz: 1
        };
        (function(a){ 
         alert(typeof a());  
        })(foo.bar);
      

  18.   

    额,你和CJ两位似乎都对标题不满哈, 各位不用这么纠结在一个无关紧要的标题上,你做错,做对,都自己清楚,标题只是吸引下注意力而已,关于出处~~ 这个题目是我在JS高级程序设计作者的BLOG上看到的,当然你给的那些题目是另一个老外出的,我也看过,但我觉得帖子的题目更有意义,并且相对来说经常混淆!如果要严格的说解释的出处,这怎么可能记得到呢? 笼统的说出处在ECMA文档!发这些题目的目的不是为了考到你们,让你们承认自己是菜鸟,我心理可没那么阴暗,各位也没必要咬文嚼字.大家自测下不就好了,发表下自己的理解给各位搞JS的朋友一起讨论讨论不就好了?
    PS: 这些题目之所以拿出来的目的,是因为大部分搞JS的朋友以及学习JS的朋友,在平常的经典JS书中,这些都是未曾提到的.  而你发的那些题,只要认真的看过一些经典的JS书都可以轻松的做出来!
      

  19.   

    呃,我说三点:
    第一,js的作用域以function为界,而不是常见的以大花括号为界;
    第二,function f(){……}定义了一个“变量”名为f,但仅限于直接function f(){……}定义,至于用该定义去给变量赋值则另论,具体是:IE认f,而fireforx不认这个横空出世的f。因此在IE中,var f=function f1(){};
    f、f1都是function;但在FF中,如果这样来,则只认f,而不认f1,除非下面补充(或者上面补充)f1的定义
    第三,js引擎先扫描所有全局下面的定义,然后从上到下赋值——这只是一个普通原则,实际上函数的定义要更早一些,也就是第二点中提到的function f1(){}用作赋值的时候,f1首先被赋值成为function。因此,
    var f1=1;
    var f2=function f1(){};
    首先定义f1,然后给它赋值为function,然后回过头去给它赋值数字1。这也是为什么接下来如果打印的话给出1的原因。定义变量在同一个作用域内不分先后。
      

  20.   

    是不是全猜中了说明我JS相当牛B了?那么不好意思,哥全中
      

  21.   

    纠结,js这个东西如果要学深了很复杂,学到基本的知识就够用了。
    但是对基础知识要知道怎么回事,prototype、原型链、apply、call、callee、caller和js中的一些基本对象搞明白了,在日程开发中足够我们自己使用的,至于楼主这样的定义在开发中我们一般是不会用到的。
      

  22.   

    第一题是不是有点问题?我认为a应该没有引号,正确的应该如下:第一题:
    if (!(a in window)) {
      var a = 1;
    }
    alert(a);这样,browser出来的结果才是“undefined”。
      

  23.   

    都是骗子,一帮大骗子我执行了下
    if (!("a" in window)) {
      var a = 1;
    }
    alert(a);各个浏览器 IE,FF, SAFRIA, GoogleChrome都是弹出1.一帮人居然在讨论这玩意。
    我看了下如果把if (!("a" in window)) 这个判断改成if (!(a in window)) 
    那才是判断一个变量是否属于 window
      

  24.   


    不知道你的是啥版本?这边IE8,FF3.6都是 undefined
      

  25.   

    >>> if (!("a" in window)) { var a = 1; } alert(a);
    undefined
    ------------
    英文版
      

  26.   

    关注~ 昨天真准备看看ecma
      

  27.   

    弱弱问一句,这些NB的js除了在这里yy,还可以用在哪里呢?
      

  28.   

    1、当你的程序出现“莫名其妙”的错误的时候,你会抓狂
    2、有些特性或者语法规则在js的项目中有他独到的应用,不知道你的程序中用过几次arguments呢。网上巧妙利用arguments的技巧多的很。真搞
    楼主的几题都是用到了相同的变量名 你一股脑儿都粘贴到一块去 你说显示什么。
      

  29.   

    看了《JavaScript运行机制浅探》真的雾散花开,貌似懂了点内层的东西了。继续学习!!!
      

  30.   

    摆脱您老别不看就认为我是一股脑儿好不,我说的都是,是指我各个浏览器测试代码一用window.onload 方法调用的时候都是1,不是指把代码放一起测试
      

  31.   

    额,我来解释下你的这种情况吧: 你把代码放在window.onload里去执行,则这个是一个函数表达式,先创建一个匿名函数,再赋值给onload, 则你的var是在函数执行环境中的,也就是说,var a 被加在匿名函数执行环境上,而不是全局环境中,调用时,环境作用力链上首先是onload函数的作用环境,其次才是全局环境即window,因此此时'a' in window是false的;另外 你说的 a in window 这种是错误的, 这个的意思是,测试a变量代表的字符串属性是否存在,会把a表示的变量转化为字符串,你的代码中,a是undefined,所以 a in window 等价于 'undefined' in window,自然是为true的了,所以你的代码会出现与我们执行不一致的清苦;
    最后举个例子: var a;
    alert(a in window);
    alert('a' in window);
    第一个对话框为true,第二个为false。 第一个等价于alert('undefined' in window);
    这个意思应该明了了吧!
      

  32.   

    上面的代码放到onload中去执行。。
      

  33.   

    我也是来学习的。而且这些我都不懂。
    所以遇到JS问题我优先采用JQUERY。
    或者找其他的插件。如果这两个方法都行不通,好吧,换个思路解题。