2016-12-25 15 views
10
let role = { 
    test: (variable) => { 
     // How do I call toLog(variable) from here? 
    }, 
    toLog: (variable) => { 
     console.log(variable); 
    } 
}; 

私はテスト()関数内でtoLog()関数を呼び出したいのですが、私はどのように気づいていないんです。同じオブジェクト内の別の関数を呼び出す方法は?

+3

'role.toLog()'か、単に[あなたがそれらを必要としない矢印の機能を使用しないでください 'this.toLog()' – Ties

+2

を使用できるようにクラスを使用します!](http://stackoverflow.com/q/34361379/1048572)(オブジェクトリテラルで)メソッドの構文を使用すると、単に 'いつものようにthis.toLog'を呼び出すことができます。 – Bergi

答えて

11

標準JS関数は動的バインディングを使用し、thisは、実行時にメソッドを呼び出している人に依存しているので、我々はrole.test()を使用して、それを呼び出す場合、それは、rolethisをバインドします。

アロー関数は現在のコンテキストにthisをバインドします。コードは、ブラウザのコンソールでwritternた場合たとえば、thiswindowオブジェクトにバインドされています。これは、それが中で定義された閉鎖へthisをバインドすることを意味を結合静的な字句、呼ばれ

あなたは矢印の機能を使用しない場合はroleによって呼び出されたとき、thisは、オブジェクト自体を指します。

この場合

const role = { 
 
    test(variable){ 
 
     this.toLog(variable); 
 
    }, 
 
    toLog(variable) { 
 
     console.log(variable); 
 
    } 
 
}; 
 

 
role.test(5);

、我々は外側のコンテキストにthisをバインドしたくないので、私たちはダイナミックの賛成でスタティックバインディングをスキップします 1。私たちはコールバックとして、このメソッドを使用します場合

しかし、動的バインディングは、メソッドを実行している人によるとthis変化します。それを防ぐために、我々はroleへの結合を明示的に静的を作成するためにbindを使用する必要があります。

const role = { 
 
    test(variable) { 
 
     this.toLog(variable); 
 
    }, 
 
    toLog(variable) { 
 
     console.log(variable); 
 
    } 
 
}; 
 

 
let test = role.test; 
 

 
try { 
 
    test(20); // will throw an error - this.toLog is not a function - because this points to window 
 
} catch (e) { 
 
    console.log(e); 
 
} 
 

 
test = role.test.bind(role); 
 

 
test(25); // will work because it's staticly binded to role

関連する問題