Betrachten Sie diesen einfachen Code:
"use strict";
var obj = {
f: function() {
this.prop = 'value';
g.bind( this )();
}
};
function g() {
console.log( this.prop );
}
Wenn ich versuche, diesen Code zu validieren, gibt mir jshint den Fehler, Possible strict violation.
wo ich anrufe console.log( this.prop );
. Dies liegt daran, dass this
in einer Funktion im strengen Modus undefiniert ist.
Aber ich binde diese Funktion, bevor ich sie aufrufe, ebenso this
wie das richtige Objekt.
Ich verwende dieses "Entwurfsmuster", um ein Durcheinander des Hauptobjekts zu vermeiden. Wenn Sie die Eigenschaften in den Parametern übergeben, wird auch die Funktion unübersichtlich, daher lehne ich dies ab. Außerdem ist dies genau das, wofür es bind
ist.
Gibt es eine Möglichkeit für JSHint, mich dies tun zu lassen?
javascript
jshint
Florian Margaine
quelle
quelle
bind
Angelegenheit jedoch nicht analysieren kann, sollte es meiner Meinung nach eine Warnung bleiben, kein Fehler. Keine Ahnung ....bind()
bind
" - Nun, hier möchten Sie vielleicht einfach etwas tung.call(this)
, denke ich. (Ich bing
mir jedoch nicht sicher, ob das Problem dadurchvar g = function() { }.bind(obj)
behoben wird .) Wenn Sie standardmäßig binden möchten , können Sie dies stattdessen tun , um jshint mit Beschwerden zu stoppen.Antworten:
Es ist äußerst schwierig, diesen Fall zu erkennen, ohne den Code auszuführen. Mit der Option können Sie
validthis
diese Warnung unterdrücken:"use strict"; var obj = { f: function() { this.prop = 'value'; g.bind( this )(); } }; function g() { /*jshint validthis:true */ console.log( this.prop ); }
Es ist zu beachten, dass jshint-Kommentare einen Funktionsumfang haben. Der Kommentar funktioniert also für die Funktion
g
und ihre inneren Funktionen, nicht nur für die nächste Zeile.quelle
this
?g
und ihrer inneren Funktionen (falls vorhanden).Sie können den gleichen Effekt auch erzielen, wenn Sie Ihren Code wie folgt ändern, um zu vermeiden, dass
this
alle zusammen verwendet werden."use strict"; var obj = { f: function() { this.prop = 'value'; g.bind( null, this )(); } }; function g(self) { console.log( self.prop ); }
quelle
Hier ist eine einfachere Lösung, die keine Änderung des Musters oder eines bestimmten Markups für jshint erfordert:
"use strict"; var obj = { f: function() { this.prop = 'value'; G.bind( this )(); } }; function G() { console.log( this.prop ); }
jshint geht davon aus, dass Sie der Konvention folgen, dass Funktionen, die mit einem Großbuchstaben beginnen, Klassen sind, die instanziiert werden und immer
this
verfügbar sind.quelle
Versuchen:
"use strict"; var obj = { f: function() { this.prop = 'value'; g.bind( this )(); } }; var g = function() { console.log( this.prop ); }
quelle
Dies ist ein anderes "Designmuster", wie Sie es ausdrücken. Es erreicht dasselbe, vermeidet jedoch das Problem vollständig.
"use strict"; function obj() { this.prop = ''; } obj.prototype.f = function obj_f() { this.prop = 'value'; this.g(); }; obj.prototype.g = function obj_g() { console.log( this.prop ); };
Sie würden es so aufrufen:
var myO = new obj(); myO.f();
quelle