超级棘手的Javascript测验,需要弄清楚答案

Super Tricky Javascript quiz, need to figure out about the answer

本文关键字:弄清楚 答案 测验 Javascript      更新时间:2023-09-26
   //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? 我以为这个.x指的是1,但它似乎不对。我只是不明白为什么它返回 4

2

.为什么它返回警报 2 而不是 1,我以为我把 a 传递给函数 a,据我所知,我把 1 传递给函数 foo,而 1 应该因为 a(当我通过时是 1(而发出警报......我只是不明白为什么它会提醒 2

  1. 运行时(在非严格模式下(调用setTimeout()回调,this绑定到window(全局上下文(,因此this.x引用外部x

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

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对象表示函数参数的列表。修改它时,您实际上修改了参数值:arguments[0] = 2修改第一个参数a = 2