2016-02-28 6 views
6

Ich las das folgende auf einer Website:JS: Was ist dieser Zwang? Was hat use-strict damit zu tun?

Use-strikte einen Vorteil. Es beseitigt diese Zwang. Ohne den strikten Modus wird ein Verweis auf einen dieser Werte von null oder undefined automatisch auf den globalen Wert gesetzt. Dies kann viele Headfakes und Bug-Out-your-Hair-Fehler verursachen. Im strikten Modus führt ein Verweis auf einen Wert von null oder nicht definiert zu einem Fehler.

Was genau bedeutet das? Was hat Use-Strict mit this Zwang zu tun?

+2

Was wissen Sie bereits über Javascript 'this'? (Wäre eine Erklärung mit den Grundlagen dessen zu beginnen, wofür "das" in einem allgemeinen Sinne gebraucht wird, oder ...?) – nnnnnn

+3

Der von Ihnen zitierte Text scheint zu erklären, was "dieser Zwang" (in diesem Zusammenhang) bedeutet. Was genau verstehst du nicht? Die Beschreibung ist nicht sehr präzise: * "Im strikten Modus führt das Verweisen auf einen Wert von null oder nicht definiert zu einem Fehler." * Das stimmt natürlich nicht. Der Zugriff auf 'this' selbst wird keinen Fehler verursachen. 'this.etwas 'würde. –

+0

Dieser [link] (http://stackoverflow.com/a/11496488/452708) könnte einige Einblicke werfen. – Abhijeet

Antwort

2

Wenn Sie eine Funktion in Javascript aufrufen, ‚dies‘, um verschiedene Dinge beziehen, abhängig vom Kontext:

  1. Wenn die Funktion gebunden ist, wird die ‚this‘ auf das, was gesetzt werden, war gebunden, z fn.bind(x)()

  2. Wenn Sie aufgerufen, um die Funktion fn.call(x) oder fn.apply(x), die dies auf x verwenden werden.

  3. Wenn die Funktion definiert wurde Pfeil-Notation, dann ist die this wird, was auch immer wurde definiert this zu sein, wenn die Funktion definiert ist.

  4. Wenn Sie die Funktion mit thing.fn() nennen, ist das this was vor dem ist ‚‘, in diesem Fall ‚Ding‘.

  5. Wenn Sie in einem Konstruktor sind, genannt mit new dann bezieht sich this auf das neue Objekt im Bau.

  6. Wenn Sie nur einen bloßen Aufruf der Funktion, das ist nicht auf ein beliebiges Objekt, , die nicht gebunden ist, ist, dass nicht ein Pfeil Funktion und Sie sind es in der einfachen Art und Weise aufrufen, ohne Rufen Sie an oder wenden Sie sich an, dann verweist this auf das globale Objekt, wenn Sie nicht im strikten Modus sind und nicht definiert, wenn Sie sich im strikten Modus befinden. Dies wird als "dieser Zwang" durch das Zitat bezeichnet.

Das ist, warum, wenn Sie eine Browser-Konsole öffnen und

Function('console.log(this)')()

die Konsole ausgibt das Fenster, das das globale Objekt im Browser ist der Typ. Allerdings, wenn Sie die Konsole öffnen und

Function('"use strict";console.log(this)')()

die Konsole geben log undefined.

Ich benutze den Function-Konstruktor hier, weil es eine Möglichkeit ist, die Verwendung des nicht-strikten Modus unabhängig von der Situation zu erzwingen - also sollten diese Beispiele immer noch funktionieren, auch wenn Sie sie aus einer Datei heraus ausführen oder Konsole, die im strikten Modus arbeitet.

this Zwang kann das der bequemste Weg, um das globale Ziel des Erhaltens, das heißt

const global = Function('return this')()

funktioniert mit jedem Browser und Knoten, auch im strikten Modus.

Aber die meiste Zeit, möchten Sie schnell scheitern, und Funktionen, die Sie auf bestimmte Arten von Instanzen tatsächlich operieren auf Ihrem globalen Objekt arbeiten können Dinge schlecht durcheinander bringen. Versuche, etwas zu schreiben oder etwas von this zu lesen, wenn Ausnahmen nicht definiert sind, sind fast immer besser als das Lesen und Schreiben des globalen Objekts.

Verwandte Themen