Angenommen, ich möchte etwas JavaScript-Code ausführen, wie kann ich den globalen Kontext so ändern, dass sogar unbegrenzte Funktionen, die darin definiert sind, an diesen neuen Kontext gebunden werden? Meine aktuelle Idee ist folgende:Ist es möglich, unbegrenzte Funktionen automatisch an etwas anderes als "Fenster" zu binden?
(function() {
var window = {foo: 'bar'}; // just an example
(function() {
// PUT CODE HERE
}).call(window);
})();
Dies funktioniert für einfache Dinge. Sowohl der Rahmen der inneren Funktion und das window
Objekt wird auf die Variable verweisen ich erklärte:
(function() {
var window = {foo: 'bar'}; // just an example
(function() {
// <CODE>
console.log(this, window);
// </CODE>
}).call(window);
})();
Der Ausgang ist das, was ich erwartet hatte: Object {foo: "bar"} Object {foo: "bar"}
.
Aber wenn der innere Code ohne Angabe ihrer Funktion definiert this
Objekt (beispielsweise nicht Function.prototype.bind
nicht verwendet), erhält sie automatisch die ursprünglichen window
Objekt als this
. Überprüfen Sie den folgenden Code und seine Ausgabe:
(function() {
var window = {foo: 'bar'};
(function() {
// <CODE>
console.log(this, window);
(function() {
console.log(this, window);
})();
// </CODE>
}).call(window);
})();
// This code outputs:
Object {foo: "bar"} Object {foo: "bar"}
Window {external: Object, chrome: Object, document: document, configData: Object, speechSynthesis: SpeechSynthesis…} Object {foo: "bar"}
Gibt es eine Möglichkeit, wirklich ein Stück Code zu bekommen Zugriff auf die ursprüngliche window
Objekt isolieren?
Man könnte immer mit 'var global = Function auf das Fenster zugreifen ('return this')();' –
@YuryTarabanko Das sollte die Antwort sein (dh "nein"). Selbst wenn die äußere Funktion hier in einen strikten Modus versetzt wird (der das innerste "Dies" daran hindert, es zu bekommen), funktioniert das immer noch, um das "Fenster" in der innersten Funktion zu erhalten. –