Ich liebe die ausführlichen, sprachunabhängigen Antworten von Leuten wie @Arak. Da diese Frage getaggt wurde JavaScript Ich möchte jedoch einige Anmerkungen machen, die sich speziell auf diese Sprache beziehen.
In JavaScript haben wir folgende Möglichkeiten für das Scoping:
- so wie es ist (keine Anpassung des Umfangs)
- lexikalisch
var _this = this; function callback(){ console.log(_this); }
- gebunden
callback.bind(this)
Ich denke, es ist erwähnenswert, dass JavaScript hat nicht wirklich dynamisches Scoping . .bind
regelt die this
und das ist nahe dran, aber technisch nicht dasselbe.
Hier ist ein Beispiel, das beide Ansätze demonstriert. Sie tun dies jedes Mal, wenn Sie eine Entscheidung über den Umfang von Rückrufen treffen, so dass dies für Versprechen, Ereignis-Handler und mehr gilt.
Das könnte man folgendermaßen bezeichnen Lexical Scoping
von Rückrufen in JavaScript:
var downloadManager = {
initialize: function() {
var _this = this; // Set up `_this` for lexical access
$('.downloadLink').on('click', function () {
_this.startDownload();
});
},
startDownload: function(){
this.thinking = true;
// Request the file from the server and bind more callbacks for when it returns success or failure
}
//...
};
Gebunden
Eine andere Möglichkeit des Umfangs ist die Verwendung von Function.prototype.bind
:
var downloadManager = {
initialize: function() {
$('.downloadLink').on('click', function () {
this.startDownload();
}.bind(this)); // Create a function object bound to `this`
}
//...
Diese Methoden sind, soweit ich weiß, verhaltensmäßig gleichwertig.
109 Stimmen
In Podcast 58 ermutigt Joel zu Fragen wie diesen, da er möchte, dass SO DER Ort für Antworten wird, auch wenn sie bereits an anderer Stelle beantwortet wurden. Dies ist eine berechtigte Frage, auch wenn man sie etwas höflicher formulieren könnte.
0 Stimmen
Und dann speziell de.wikipedia.org/wiki/Scope_(Programmierung) die ein schönes (Pascal/Delphi) Beispiel für verschachtelte Bereiche in verschachtelten Prozeduren enthält.
18 Stimmen
Es ist möglich, dass der Fragesteller nicht fließend Englisch spricht (oder sprach), als er diese Frage schrieb.
50 Stimmen
Die Frage ist höflich, er sagt einfach, was er will. Es steht Ihnen frei, zu antworten. Hier besteht kein Bedarf an überempfindlicher Höflichkeit.
38 Stimmen
Ich finde Fragen wie diese großartig, weil sie Inhalte für SO schaffen. IMO, wen kümmert es, wenn die Frage keine Mühe macht... die Antworten werden großartigen Inhalt haben und das ist es, was in diesem Forum zählt.
10 Stimmen
Ich stimme mit @Jwan622 überein, dass eine Frage nicht langatmig sein muss, um eine gute Frage zu sein.