2016-05-02 6 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.なぜ1の代わりに4を返しますか?私はthis.xが1を参照していると思っていましたが、間違っているようです....私はなぜそれが4を返すのか分かりません。スーパートリッキーなJavascriptのクイズ、答えについて把握する必要があります

2.Whatは1の代わりに警告2を返します。私の知る限りでは、私は関数fooに1を渡し、1(1私が通過している)ためを警告しなければならない....私は理解していない、なぜそれ警告2

+0

console.log 'this'これはウィンドウを参照していることを示しています。そのレベルではxは4と定義されています。これはすべてスコープに関するものです。この記事、特にクロージャの中の 'this'についての部分をチェックしてください;)http://javascriptissexy.com/understand-javascripts-this-with-clarity-and-master-it/ – HolyMoly

答えて

5
  1. ランタイム(厳密でないモードで)はthiswindow(グローバルコンテキスト)にバインドされたsetTimeout()コールバックを呼び出します。したがって、this.xは外部xを参照します。

  2. argumentsオブジェクトは、関数の仮パラメータをエイリアスする方法として機能します。 arguments[0]の値を設定すると、最初に宣言されたパラメーターの値も関数に設定されます。

1

1.なぜ1ではなく4を返しますか?

注意最初の初期化: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ではなく1

argumentsオブジェクトの戻り2.why

は、関数の引数のリストを表します。これを変更すると、実際に引数の値が変更されます。arguments[0] = 2は、最初の引数a = 2を変更します。

関連する問題