JavaScript 严格模式

"use strict"; 定义 JavaScript 代码应该以“严格模式”执行。

"use strict" 指令

"use strict" 是 JavaScript 1.8.5 中的新指令(ECMAScript version 5)。

它不算一条语句,而是一段文字表达式,更早版本的 JavaScript 会忽略它。

"use strict"; 的作用是指示 JavaScript 代码应该以“严格模式”执行。

在严格模式中,您无法,例如,使用未声明的变量。

以下版本的浏览器支持严格模式:

  • 版本 10 以后的 IE
  • 版本 4 以后的 Firefox
  • 版本 13 以后的 Chrome
  • 版本 5.1 以后的 Safari
  • 版本 12 以后的 Opera

声明严格模式

通过在脚本或函数的开头添加 "use strict"; 来声明严格模式。

在脚本开头进行声明,拥有全局作用域(脚本中的所有代码均以严格模式来执行):

实例

"use strict";
x = 3.14;       // 这会引发错误,因为 x 尚未声明

Δοκιμάστε το προσωπικά

实例

"use strict";
myFunction();
function myFunction() {
     y = 3.14;   // 这会引发错误,因为 y 尚未声明
}

Δοκιμάστε το προσωπικά

在函数中声明严格模式,拥有局部作用域(只有函数中的代码以严格模式执行):

x = 3.14;       // 这不会引发错误
myFunction();
function  myFunction() {
	"use strict";
	 y = 3.14;   // 这会引发错误
}

Δοκιμάστε το προσωπικά

"use strict"; 语法

声明严格模式的语法被设计为兼容更早版本的 JavaScript。

编译 JavaScript 程序中的数值文字(例如 4+5)或字符串文字("Bill Gates")不会有负面效果。它只会编译为不存在的变量然后消失。

Όλα "use strict"; Απέχουν μόνος του τον νέο μεταφραστή που κατανοεί τη σημασία του.

Γιατί να χρησιμοποιούμε το σκληρό μοντέλο;

Το σκληρό μοντέλο μας καθιστά πιο εύκολο να γράψουμε "安全的" JavaScript.

Το σκληρό μοντέλο μετατρέπει τις προηγούμενα αποδεκτές "κακές γραμματικές" σε πραγματικά σφάλματα.

Για παράδειγμα, στο συνηθισμένο JavaScript, η λάθος πληκτρολόγηση ονόματος μεταβλητών θα δημιουργήσει νέες παγκόσμιες μεταβλητές. Στο σκληρό μοντέλο, αυτό θα προκαλέσει σφάλμα, οπότε δεν είναι δυνατόν να δημιουργηθούν τυχαία παγκόσμιες μεταβλητές.

Στο συνηθισμένο JavaScript, αν εκτελέσουμε τιμή σε μη γράψιμο ιδιοτήτες, οι κατασκευαστές δεν θα λάβουν καμία ανατροφοδότηση σφάλματος.

Στο σκληρό μοντέλο, η εκτέλεση τιμής σε μη γράψιμο, μόνος αναγνωστικός, μη υπαρκτό ιδιοτήτες ή σε μη υπαρκτές μεταβλητές ή αντικείμενα θα προκαλέσει σφάλμα.

Απωστικά, πράγματα που δεν επιτρέπεται στο σκληρό μοντέλο

Η χρήση μεταβλητών χωρίς δήλωση, δεν επιτρέπεται:

"use strict";
x = 3.14;                // Θα προκαλέσει σφάλμα

Δοκιμάστε το προσωπικά

Τα αντικείμενα είναι μεταβλητές

Η χρήση αντικειμένων χωρίς δήλωση δεν επιτρέπεται:

"use strict";
x = {p1:10, p2:20};      // Θα προκαλέσει σφάλμα

Δοκιμάστε το προσωπικά

Η διαγραφή μεταβλητών (ή αντικειμένων) δεν επιτρέπεται:

"use strict";
var x = 3.14;
delete x;                // Θα προκαλέσει σφάλμα

Δοκιμάστε το προσωπικά

Η διαγραφή συνάρτησης δεν επιτρέπεται:

"use strict";
function x(p1, p2) {}; 
delete x;                 // Θα προκαλέσει σφάλμα

Δοκιμάστε το προσωπικά

Η επανάληψη ονομάτων παραμέτρων δεν επιτρέπεται:

"use strict";
function x(p1, p1) {};   // Θα προκαλέσει σφάλμα

Δοκιμάστε το προσωπικά

Οι τετραψήφιοι αριθμοί γραμμάτων δεν επιτρέπεται:

"use strict";
var x = 010;             // Θα προκαλέσει σφάλμα

Δοκιμάστε το προσωπικά

Οι χαρακτήρες αποκρυπτογράφησης δεν επιτρέπεται:

"use strict";
var x = \010;            // Θα προκαλέσει σφάλμα

Δοκιμάστε το προσωπικά

Η εγγραφή μόνος αναγνωστικής ιδιοτήτων δεν επιτρέπεται:

"use strict";
var obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});
obj.x = 3.14;            // Θα προκαλέσει σφάλμα

Δοκιμάστε το προσωπικά

Η εγγραφή μόνος διαβάσιμος ιδιοτήτων δεν επιτρέπεται:

"use strict";
var obj = {get x() {return 0} };
obj.x = 3.14;            // Θα προκαλέσει σφάλμα

Δοκιμάστε το προσωπικά

Η διαγραφή μη διαγράφεικων ιδιοτήτων δεν επιτρέπεται:

"use strict";
delete Object.prototype; // Θα προκαλέσει σφάλμα

Δοκιμάστε το προσωπικά

Η συμβολη "eval" δεν μπορεί να χρησιμοποιηθεί ως μεταβλητή:

"use strict";
var eval = 3.14;         // Θα προκαλέσει σφάλμα

Δοκιμάστε το προσωπικά

Η συμβολη "arguments" δεν μπορεί να χρησιμοποιηθεί ως μεταβλητή:

"use strict";
var arguments = 3.14;    // Αυτό θα προκαλέσει σφάλμα

Δοκιμάστε το προσωπικά

with Δεν επιτρέπεται η χρήση της πρότασης:

"use strict";
with (Math){x = cos(2)}; // Αυτό θα προκαλέσει σφάλμα

Δοκιμάστε το προσωπικά

Δεν επιτρέπεται η χρήση του with για λόγους ασφαλείας eval() Δημιουργία μεταβλητών στην περιοχή όπου καλούνται:

"use strict";
eval ("var x = 2");
alert (x);               // Αυτό θα προκαλέσει σφάλμα

Δοκιμάστε το προσωπικά

Σε μια κλήση λειτουργίας όπως f(), η τιμή του this είναι το αντικείμενο του παγκόσμιου αντικειμένου. Στο σφιχτό μοτίβο, τώρα είναι undefined

Προστασία για το μέλλον

Δεν επιτρέπεται η χρήση των λέξεων-κλειδιών που προορίζονται για το μέλλον σε σφιχτό μοτίβο. Είναι αυτές:

  • implements
  • interface
  • let
  • package
  • private
  • protected
  • public
  • static
  • yield
"use strict";
var public = 1500;      // Αυτό θα προκαλέσει σφάλμα

Δοκιμάστε το προσωπικά

Προειδοποίηση

"use strict" Οι οδηγίες μπορούν να χρησιμοποιηθούν μόνο σε σενάρια ή σε λειτουργίες.ΆρχισηΑναγνωρίζεται.