私はしばしばコードでこれを見る:var me = this;
。何故ですか?ローカル変数で 'this'を参照すると、パフォーマンスが向上しますか?ローカル変数で 'this'を参照する必要がありますか?
答えて
内部にという関数があると便利です。そのような入れ子関数内のコードは、外部コンテキストからthis
の値にアクセスする必要があります。 this
は、すべての関数呼び出しのために新たに確立されているので
function example() {
var me = this;
document.getElementById('whatever').onclick = function() {
me.clicked = 1;
};
}
は、変数に外側this
をスタッシュすることなく、内側の関数から全くそれを参照する方法がないと思います。
this
への参照を保存するために使用します。コードの後半にはコールバック付きのAJAX呼び出し(たとえば)があります。したがって、そのコールバックの中でthis
は外部と同じではありません。だからこそ人々は "外側" this
を変数にバックアップしています。
私は個人的にこのフォームを使用したい:
var that = this;
は、ちなみに
:)おかしいCoffeeScript、「右行われたJavaScript」の一種である、このための修正プログラムがありますよく
これには、機能定義、薄い矢印と太い矢印の2つの形式があります。細い矢印はjavascriptとまったく同じように動作し、太い矢印は自動的にthis
を外部コンテキストの値にバインドします。だから、
、このCoffeeScriptの
Account = (customer, cart) -> # thin arrow
@customer = customer
@cart = cart
$('.shopping_cart').bind 'click', (event) => # fat arrow
@customer.purchase @cart
はこのJavaScript
var Account;
Account = function(customer, cart) {
var _this = this;
this.customer = customer;
this.cart = cart;
return $('.shopping_cart').bind('click', function(event) {
return _this.customer.purchase(_this.cart);
});
};
クールに変換します、そうではありませんか?
this
が変更された場合でも、必要なコードにはthis
という参照が残っています。
IMOそれはあなた自身がそれを見るのは珍しいことです。それは、実行中に評価された宣言ではなく、this
値のJSの処理を避けるためにクロージャが関与するときにほぼ常に使用されるコンストラクトです。
コールバックが実行されるときにスコープが異なるコールバックメソッドによく使用されます。
例:
var me = this;
$.getJSON(url, function(data) {
// here "this" will be "window", so "me" is used to access the object
})
閉鎖スコープのためのものです。これらの2つのjQueryプラグインの違いを見てください。
$.fn.blinkClosure = function() {
var jQueryMonad = this, toggleClass = this.toggleClass;
setInterval(function() {
toggleClass.apply(jQueryMonad, ['invisible']);
}, 500);
};
問題はsetInterval
です。 setInterval
の関数が呼び出されると、新しいチェーンが実行され、そのチェーン内のthis
はwindow
にバインドされます。クロージャの例では、プラグインを適用するjQueryオブジェクトへの参照をjQueryMonad
(またはコードのme
)に保存しています。このようにして、javascriptで範囲を正しく維持することができます。
$.fn.blink = function() {
setInterval($.proxy(function() {
this.toggleClass('invisible');
}, this), 500);
};
第2の例では、jQuery.proxy
がそれを処理します。
これは、javacriptが作成時に実行時にthis
をバインドするときの問題を解決するためです。
通常の理由は、コードに後で呼び出されるクロージャが含まれており、クロージャが現在のthis
にアクセスできるようにしたいということです。例:
は、ここの人々は頻繁にこのように、間違って記述したコードです:
var obj = {
name: "Fred",
foo: function() {
setTimeout(function() {
alert(this.name); // <=== Fails, `this` is no longer `obj`
}, 1000);
}
};
obj.foo();
はここvar me = this;
がそれに適用されていることです:
var obj = {
name: "Fred",
foo: function() {
var me = this;
setTimeout(function() {
alert(me.name); // <=== Works now
}, 1000);
}
};
obj.foo();
JavaScriptで、this
がによって完全に定義されているので、これは、約来てファンクションが定義されている場所ではなく、ファンクションがと呼ばれています。これは、内側の関数で使用される
:
もっと読み(開示:両方は私のブログへのリンクです)。ご存じのように、オブジェクトコンストラクタに関数を持たせることができ、関数内に関数が存在することがあります。下のコードが表示されている場合。
function Circle(radius){
this.radius=radius;
this.getArea=function(){
var changeRadius=function(){
this.radius=20; //here this points to global
}
changeRadius();
return Math.PI*Math.pow(this.radius, 2);
}
}
var cd= new Circle(10);
console.log(cd.getArea());
はあなたのgetArea()を呼び出すと、あなたはchangeRadius()が、内部機能changeRadius内を呼び出しているが、これは代わりに、作成したオブジェクトのグローバルオブジェクトを指すように開始し、半径10に従って面積を取得します。ここでは、var self=this construct
を使用します。
この状況を回避するために、以下の変更を加えることができます。
function Circle(radius){
var self=this;
this.radius=radius;
this.getArea=function(){
var changeRadius=function(){
self.radius=20;
}
changeRadius();
return Math.PI*Math.pow(this.radius, 2);
}
}
var cd= new Circle(10);
console.log(cd.getArea());
- 1. php5で変数を参照渡しする必要がありますか?
- 2. サーブレットフィルタ:ソケットをdoFilter()で参照する必要があります
- 3. WiXプラグインインストーラがプライマリインストールを参照する必要があります
- 4. WebGetAttribute何を参照する必要があります
- 5. マルチスレッドでローカル変数をロックする必要がありますか?
- 6. .net:Module System.Coreバージョン3.5.0.0を参照する必要があります
- 7. Javaローカル変数、オブジェクト参照、インスタンス変数はどこにありますか
- 8. イベントディスパッチスレッドで 'ローカル変数を最終宣言する必要があります'
- 9. 参照型の変数にもvolatileが必要ですか?
- 10. ORA-02256:参照列の数が参照列と一致する必要があります
- 11. JSPでどのJSTL URLを参照する必要がありますか?
- 12. 親クラスが子クラスを参照する必要がありますか?
- 13. 厳密な基準:参照のみで変数を割り当てる必要があります。5.4
- 14. ビジネスオブジェクトにオブジェクトまたは参照を含める必要がありますか?
- 15. 参照アセンブリを強制的にロードする必要がありますか?
- 16. signed_requestの処理。参照元を確認する必要がありますか?
- 17. Assert.IsNotNull(...) - VS 2010どの参照を追加する必要がありますか?
- 18. Data Mapperはドメインモデルを参照する必要がありますか?
- 19. エンティティ名はエンティティ参照の '&'の直後にある必要があります
- 20. Androidプラットフォームのインタフェースでオブジェクトを参照する必要があります
- 21. ボタンはC#で自分自身を参照する必要があります
- 22. プライベート変数を参照するとき、this.variableName宣言が必要ですか?
- 23. 弱参照はいつ使用する必要がありますか?
- 24. セッション作成時に参照のみで変数を渡す必要があります
- 25. アセンブリへの参照を追加する必要がありますSystem、Version = 1.0.5000.0
- 26. スレッドが開始されると、そのスレッドへの参照を保持する必要がありますか?
- 27. スカラー変数を宣言する必要がありますか?
- 28. グローバル変数を使用する必要がありますか?
- 29. jQuery - 変数をURLエンコードする必要がありますか?
- 30. ローカル変数のみを変更するスレッドを同期させる必要がありますか?
ありがとう! – ilija139