Super Tricky Javascript测验,需要弄清楚答案

时间:2016-05-02 19:02:00

标签: javascript

   //1st question
   var x = 4,
     obj = {
       x: 3,
       bar: function() {
         var x = 2;
         setTimeout(function() {
           var x = 1;
           alert(this.x);
         }, 1000);
       }
     };
   obj.bar();

   //2nd question
   function foo(a) {
     arguments[0] = 2;
     alert(a);
   }
   foo(1);

1.为什么它会返回4而不是1?我认为this.x参考1,但它似乎错了....我只是不明白为什么它返回4

2.为什么它返回警报2而不是1,我认为我将a传递给函数a,据我所知,我将1传递给函数foo,并且1应该因为a而警告(当时为1时我通过了....我只是不明白它为什么警告2

2 个答案:

答案 0 :(得分:5)

  1. 运行时(在非严格模式下)调用http://PUBLIC_IP_ADDRESS/api/users回调,setTimeout()绑定到this(全局上下文),因此window指的是外this.x

  2. x对象用作别名函数形式参数的方法。设置arguments的值也会将第一个声明的参数的值设置为函数。

答案 1 :(得分:1)

1。为什么它返回4而不是1?

注意第一次初始化:var x = 4,它在非严格模式下将属性x附加到全局对象:window.x = 4

setTimeout(function() {
 var x = 1;
 alert(this.x);
}, 1000);

setTimout()回调有this个上下文作为全局对象。实际上是在呼叫alert(this.x) - > alert(window.x) - > alert(4)

2.为什么它返回警报2而不是1

arguments object表示函数参数列表。修改它时,实际上会修改参数值:arguments[0] = 2修改第一个参数a = 2