2016-12-11 10 views
0

私は時間と関数とメソッドのバインディングを理解しようとしています。私はインターネット上の "束縛"についてのいくつかの記事を見てきましたが、私はそれらを簡単に理解することはできません。誰かが私にそれをもっとはっきりと説明できることを願っています。

私はこのJavaScriptコードがあります。メソッドと関数バインドと混同しました

function Foo(name) { 
    this.name = name; 
} 

function sayHello() { 
    console.log('Hello ' + this.name); 
} 

var foo = new Foo('Jack'); 

var substFunc = foo.sayHello.bind(foo); 

substFunc(); 

を私はので、私は「こんにちは、ジャック」を表示するための方法としてそれを使用することができFoo()に拘束されることにsayHello()機能をしたいが、それはメッセージを失敗し、表示されましたコンソール上:

Uncaught TypeError: Cannot read property 'bind' of undefined(...)

+0

バインディングを理解するには、まずスコープを理解する必要があります。バインドは基本的に "this"の範囲を変更します。私はそこから始めることを提案します。 :) – alexr101

+0

チップのおかげで。私はちょうど初心者です – jst16

答えて

2

は、あなたは非常に近かった、とFunction#bindのご理解は問題ではありませんでした

sayHelloは、あなたが好きそれにアクセスできるようにしかし、それは、グローバル変数で、fooのプロパティではありません。

var substFunc = sayHello.bind(foo); 

スニペット:

function Foo(name) { 
 
    this.name = name; 
 
} 
 

 
function sayHello() { 
 
    console.log('Hello ' + this.name); 
 
} 
 

 
var foo = new Foo('Jack'); 
 

 
var substFunc = sayHello.bind(foo); 
 

 
substFunc();

+0

私はその 'foo'のためにちょっと恥ずかしいと感じます。ありがとう:) – jst16

1

このエラーの今後あなたが使用しているためにアップしました

foo.sayHello 

...しかし、あなたは決してfooのためにその関数を定義していません。 sayHelloは独立した関数です。それは理にかなっていますか?

また、簡単なバインディングを理解するには、単純なjqueryイベントバインダーを使用します。

ボタンを押したときに機能をトリガーするようにボタンをバインドするとします。この関数はbuttonPressed()です。ボタンはこの関数を呼び出したので...関数からthisを呼び出すと、ボタンを参照します。

$button.on('click', buttonPressed); 

function buttonPressed(){ 
    //this == button 
} 

しかし、 "this"変数で別の要素を操作したい場合は、その代わりに他の要素をバインドします。

$button.on('click', buttonPressed).bind($otherElement); 

function buttonPressed(){ 
    //this == otherElement 
} 
+0

大きな助けとヒント。ありがとう:) – jst16

+0

そして、ところで、その '$ otherElement'とは何ですか? '$( 'span')'や '$( 'p')'のような別のDOM要素ですか? – jst16

+0

はい、それは私が意味していたもので、ボタンではない他の要素です:-) – alexr101

関連する問題