2017-07-17 11 views
0

最近、私はJohn Resigの「The Secrets of JavaScript Ninja」を読んでいて、リスト4.10に到達しました。つまり、ボタンがクリックされたときにコードが印刷される、特定のコンテキストを関数にバインドします。 通常の関数式の代わりに矢印関数を使用した場合にのみ、コードが正常に実行されることを示しています。関数式でコードが正常に動作しないのはなぜですか?どのようにこののキーワードが機能しますか?ここでこのキーワードは、関数式と矢印関数でどのように機能しますか?

は、関数式とコードです:

function Button() { 
 
    this.clicked = false; 
 
    this.click = function() { 
 
    this.clicked = true; 
 
    if (button.clicked) { 
 
     "The button has been clicked" 
 
    }; 
 
    }; 
 
} 
 
var button = new Button(); 
 
var elem = document.getElementById("test"); 
 
elem.addEventListener("click", button.click);
<button id="test">Click Me!</button>

、ここでは、(完璧に動作)矢印機能付きコードです:

function Button() { 
 
    this.clicked = false; 
 
    this.click =() => { 
 
    this.clicked = true; 
 
    if (button.clicked) { 
 
     console.log("The button has been clicked"); 
 
    } 
 
    }; 
 
} 
 
var button = new Button(); 
 
var elem = document.getElementById("test"); 
 
elem.addEventListener("click", button.click);
<button id="test">Click Me!</button>

+2

矢印式を使用すると、 'this'は現在のスコープを維持しますが、正規関数式' this'はスコープを変更して関数内のスコープを参照します。 –

+1

[このキーワードはどのように機能しますか?](https://stackoverflow.com/questions/3127429/how-does-the-this-keyword-work) – abhishekkannojia

+0

https://developer.mozilla.org/ja-jp/docs/Web/JavaScript /リファレンス/関数/ Arrow_functions –

答えて

0

次のコードを実行できます。

function Button1() { 
 
    this.clicked = false; 
 
    this.click = function() { 
 
    this.clicked = true; 
 
\t console.log('bt1',this); 
 
    if (button1.clicked) { 
 
     console.log("The button has been clicked 1"); \t 
 
    }; 
 
    }; 
 
} 
 
function Button2() { 
 
    this.clicked = false; 
 
    this.click =() => { 
 
    this.clicked = true; 
 
\t console.log('bt2',this); 
 
    if (button2.clicked) { 
 
     console.log("The button has been clicked 2"); 
 
    } 
 
    }; 
 
} 
 

 
var button1 = new Button1(); 
 
var button2 = new Button2(); 
 
var elem = document.getElementById("test"); 
 
elem.addEventListener("click", button1.click); 
 
elem.addEventListener("click", button2.click);
<button id="test">Click Me!</button>

'これは' 通常の機能では、HTMLのみです。

「button1.click.bind(button1)」を使用すると正常に実行されます。

関連する問題