2016-11-14 14 views
2

thisキーワードを関数内で使用すると、関数にパラメータを渡すよりもコンテキストを渡す方が良いことがわかります。例のため関数のコンテキストの使用と関数へのパラメータの受け渡し

var dog = { 
    name: 'puppy' 
}; 

function foo(obj) { 
    console.log(obj.name); 
} 

foo(dog); // puppy 

私は私のコードではあまりに上記のパターンの方法を、次のされていることに気づきました。私は限界を明白にしている段階には達していませんが。私はどのようにthisを使用してよりエレガントな知りたいです。つまり、代わりに以下のパターンを使用します。

function foo(){ 
    console.log(this.name); 
} 

foo.call(dog); //puppy 
+1

*私は、上記のパターンのやり方が自分のコードで多すぎることに気づきました。*これは、歴史の幕開けからJSで使用されている、関数にパラメータを渡す基本パターンです。 –

+0

私は知っていますが、後者の習慣に従えばよりクリーンなAPIを促進するという主張がなされています。したがって、質問は.... – bikash

答えて

0

これは実際に機能するものと達成しようとしているものによって異なります。

しかし、率直に言って、あなたの簡単な例では、コンテキストを使用するための最良のユースケースは、dogオブジェクト、そのようにfonctionを追加し、あなたがコンテキストを毎回設定する必要がなくなりになります。

var dog = { 
 
    name: 'puppy', 
 
    printName: function() { 
 
    console.log(this.name); 
 
    } 
 
}; 
 

 
dog.printName();

それともdogオブジェクトからクラスを作ります。

var Dog = function(name) { 
 
    this._name = name; 
 
}; 
 

 
Dog.prototype = { 
 
    constructor: Dog, 
 
    getName: function() { 
 
    return this._name 
 
    }, 
 
    printToConsole: function() { 
 
    console.log("Dog named", this.getName()); 
 
    } 
 
}; 
 

 
var myDog = new Dog("puppy"); 
 

 
myDog.printToConsole();

機能fooは、各時間は意味をなさないコンテキストを設定する必要が、フリー機能になるだろうされている場合。パラメータを渡すことが最善の方法です。

.call,.applyまたは.bindを使用すると、他のオブジェクトからのメソッドであるコールバックを処理するときに意味があります。オブジェクトがdogオブジェクトにその使用を制限し、nameという名前のプロパティを持っている場合

はまた、foo.call(dog);またはfoo(dog)にのみ有効です。

それは直接nameを受け取ることができます:

function foo(name) { 
    console.log(name); 
} 
foo(dog.name); 
1

を、私は、コンテキストを渡すことによって、関数内でthisキーワードを使用すると、関数にパラメータを渡すよりも優れているかを知りたいです。

これが短いと同じように広範な答えがthis.propertyを使用すると、関数の呼び出し場所のオブジェクトの値を使用する関数を構築することが可能になるということです非常に幅広い質問

です。

なぜそれはスマートですか? を手動でに渡すことなく、関数を使用しているさまざまなコンテキストを反映する引数を繰り返し渡すことができます。


は手動thisのコンテキストを設定する.call.apply.bindを使用することができます。これは、関数のコールサイトに頼ることができず、コンテキストを設定するだけで、基本的に "無制限"の引数を渡すことができる場合に便利です。

+0

'foo.call(dog)'と 'foo(dog)'の両方は 'dog 'を均等に渡す必要があります。 –

+0

合意されているので、引き数を引き渡すよりも似ています。 'this'は' .call'、 '.apply'、および' .bind'を理解することから始めるべきではありません。 – rabbitco

関連する問題