2016-05-02 32 views
3
//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超級棘手的Javascript測驗,需要弄清楚答案

2.爲什麼它返回警報2而不是1,我想我通過一個函數,並且據我所知,我通過1函數foo,和1應該因爲一個提醒(這是當我通過1)....我只是不明白爲什麼它警告2

+0

console.log'this',你會看到它指的是窗口。在這個水平上x被定義爲4.這是關於範圍界定的。看看這篇文章,特別是關於關閉裏面的'this'的部分;)http://javascriptissexy.com/understand-javascripts-this-with-clarity-and-master-it/ – HolyMoly

回答

5
  1. 運行時(在非嚴格模式下)調用setTimeout()回調,this綁定到window(全局上下文),因此this.x引用外部x

  2. arguments對象用作別名函數形式參數的一種方式。設置arguments[0]的值還會將第一個聲明參數的值設置爲該函數。

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對象代表的函數的參數列表。修改它時,實際上修改參數值:arguments[0] = 2修改第一個參數a = 2