javascript strict作用 - JavaScript中使用“嚴格”做什麼,背後的原因是什麼?




13 Answers

這篇關於Javascript Strict Mode的文章可能會讓您感興趣: John Resig - ECMAScript 5 Strict Mode,JSON等

引用一些有趣的部分:

嚴格模式是ECMAScript 5中的一項新功能,允許您在“嚴格”操作上下文中放置程序或函數。 這種嚴格的上下文阻止了某些操作被採取並引發更多異常。

和:

嚴格模式有兩種方式:

  • 它捕獲了一些常見的編碼bloopers,拋出異常。
  • 當採取相對“不安全”的操作(例如獲取對全局對象的訪問權限)時,它會阻止或拋出錯誤。
  • 它會禁用令人困惑或經過深思熟慮的功能。

另請注意,您可以對整個文件應用“嚴格模式”...或者您只能將其用於特定功能(仍然引用John Resig的文章)

// Non-strict code...

(function(){
  "use strict";

  // Define your library strictly...
})();

// Non-strict code... 

如果你必須混合舊代碼和新代碼,這可能會有所幫助;-)

所以,我認為它有點像你可以在Perl中"use strict""use strict" (因此名稱?) :通過檢測更多可能導致破壞的事情,它可以幫助您減少錯誤。

目前,它受到所有主流瀏覽器支持 (IE 9及以下版本)

use node

最近,我通過Crockford的JSLint運行了一些我的JavaScript代碼,它給出了以下錯誤:

第1行問題1:缺少“使用嚴格”聲明。

做一些搜索,我意識到有些人加上"use strict"; 進入他們的JavaScript代碼。 一旦我添加了語句,錯誤就會停止顯示。 不幸的是,谷歌沒有透露這個字符串聲明背後的歷史。 當然它必須與瀏覽器如何解釋JavaScript有關,但我不知道效果會是什麼。

那麼什麼是"use strict"; 一切,它意味著什麼,它仍然相關嗎?

當前任何瀏覽器都會響應"use strict"; 字符串或將來使用?




聲明"use strict"; 指示瀏覽器使用嚴格模式,這是一種簡化且更安全的JavaScript功能集。

功能列表(非詳盡)

  1. 不允許全局變量。 (在變量名中捕獲缺少的var聲明和拼寫錯誤)

  2. 無提示失敗的分配將在嚴格模式下拋出錯誤(指定NaN = 5;

  3. 嘗試刪除不可刪除的屬性將拋出( delete Object.prototype

  4. 要求對象文字中的所有屬性名稱都是唯一的( var x = {x1: "1", x1: "2"}

  5. 函數參數名稱必須唯一( function sum (x, x) {...}

  6. 禁止八進制語法( var x = 023;一些開發人員錯誤地認為前面的零不會改變數字。)

  7. 禁止使用with關鍵字

  8. 嚴格模式下的eval不會引入新變量

  9. 禁止刪除普通名稱( delete x;

  10. 禁止以任何形式綁定或賦值名稱evalarguments

  11. 嚴格模式不會使用形式參數別名arguments對象的屬性。 (即function sum (a,b) { return arguments[0] + b;}這是有效的,因為arguments[0]綁定到a等等。)

  12. arguments.callee不受支持

[參考: 嚴格模式Mozilla開發者網絡 ]




需要注意的是,所有硬編程程序員:對現有代碼應用"use strict"可能是危險的! 這個東西不是一些感覺良好,快樂的貼紙,你可以打上代碼,讓它“更好”。 使用"use strict"編譯指示,瀏覽器會在以前從未扔過的隨機位置突然出現異常只是因為在那個位置你正在做一些默認/鬆散JavaScript允許但嚴格的JavaScript憎惡的東西! 你可能有嚴格的違規行為隱藏在代碼中很少使用的調用中,這些調用只會在最終運行時拋出異常 - 例如,在付費客戶使用的生產環境中!

如果您想採取措施,最好將"use strict"與全面的單元測試和嚴格配置的JSHint構建任務結合使用,這將使您確信模塊中沒有黑暗的角落會爆炸可怕的只是因為你打開了嚴格模式。 或者,嘿,這是另一個選擇:只是不要在你的任何遺留代碼中添加"use strict" ,它可能更安全,老實說。 絕對不要"use strict"添加到您不擁有或維護的任何模塊,例如第三方模塊。

我認為即使它是一種致命的籠養動物, "use strict"可能是好事,但你必須做得對。 嚴格要求的最佳時機是您的項目是綠地並且您從頭開始。 配置JSHint/JSLint ,所有的警告和選項都會隨著團隊的需要而變得緊張,得到一個好的構建/測試/斷言系統,如同Grunt+Karma+Chai ,並且只有那麼開始將所有新模塊標記為"use strict" 。 準備好治愈許多瑣碎的錯誤和警告。 如果JSHint/JSLint產生任何違規,請確保每個人都了解重力,將構建配置為FAIL。

當我採用"use strict"時,我的項目不是一個綠地項目。 結果,我的IDE充滿了紅色標記,因為我的模塊的一半沒有"use strict" ,JSHint抱怨這一點。 這讓我想起了將來我應該做什麼重構。 我的目標是由於我所有遺失的"use strict"聲明而成為紅色標記,但現在還需要幾年的時間。




我強烈建議每個開發人員現在開始使用嚴格模式。 有足夠的瀏覽器支持它,嚴格的模式將合法地幫助我們避免我們甚至不知道你的代碼中的錯誤。

顯然,在初始階段,我們以前從未遇到過錯誤。 為了獲得全部好處,我們需要在切換到嚴格模式後進行適當的測試,以確保我們已經捕獲了所有內容。 當然,我們不只是在代碼中拋出use strict並假設沒有錯誤。 所以,流失是時候開始使用這個非常有用的語言功能來編寫更好的代碼。

例如,

var person = {
    name : 'xyz',
    position : 'abc',
    fullname : function () {  "use strict"; return this.name; }
};

JSLint是Douglas Crockford編寫的調試器。 只需粘貼您的腳本,它就會快速掃描代碼中的任何明顯問題和錯誤。




我的兩分錢:

嚴格模式的目標之一是允許更快地調試問題。 它可以幫助開發人員在發生某些可能導致網頁無聲和奇怪行為的錯誤事件時拋出異常。 當我們使用use strict ,代碼會拋出錯誤,這有助於開發人員提前修復它。

use strict後我學到的幾件重要事情:

防止全局變量聲明:

var tree1Data = { name: 'Banana Tree',age: 100,leafCount: 100000};

function Tree(typeOfTree) {
    var age;
    var leafCount;

    age = typeOfTree.age;
    leafCount = typeOfTree.leafCount;
    nameoftree = typeOfTree.name;
};

var tree1 = new Tree(tree1Data);
console.log(window);

現在,此代碼在全局範圍內創建nameoftree ,可以使用window.nameoftree進行訪問。 當我們實現use strict ,代碼會拋出錯誤。

未捕獲的ReferenceError:未定義nameoftree

Sample

消除聲明:

使用uglify-js等工具無法縮小語句。 它們也deprecated並從未來的JavaScript版本中刪除。

Sample

防止重複:

當我們有重複屬性時,它會拋出異常

Uncaught SyntaxError:嚴格模式下不允許對象文字中的重複數據屬性

"use strict";
var tree1Data = {
    name: 'Banana Tree',
    age: 100,
    leafCount: 100000,
    name:'Banana Tree'
};

還有更多,但我需要獲得更多的知識。




嚴格模式對常規JavaScript語義進行了一些更改:

  • 通過更改它們以拋出錯誤來消除一些JavaScript無聲錯誤。

  • 修復了使JavaScript引擎難以執行優化的錯誤。

  • 禁止在ECMAScript的未來版本中定義某些語法。

了解更多信息vistit Strict Mode- Javascript




“使用嚴格”; 是程序員不會使用JavaScript的鬆散或不良屬性的保險。這是一個指南,就像一個統治者將幫助你做直線。“使用嚴格”將幫助您進行“直接編碼”。

那些不喜歡使用標尺來直線行的人通常會在那些要求其他人調試代碼的頁面中結束。

相信我。與設計不良的代碼相比,開銷可以忽略不計。多年來一直擔任高級JavaScript開發人員的Doug Crockford在這裡發表了一篇非常有趣的帖子。就個人而言,我喜歡一直回到他的網站,以確保我不忘記我的良好做法。

現代JavaScript實踐應該始終喚起“使用嚴格”; 附註。ECMA集團選擇“嚴格”模式的唯一原因是允許經驗較少的編碼人員訪問JavaScript,然後有時間適應新的更安全的編碼實踐。




引自w3schools

“使用嚴格”指令

“use strict”指令是JavaScript 1.8.5(ECMAScript版本5)中的新指令。

它不是一個語句,而是一個文字表達式,被早期版本的JavaScript忽略。

“use strict”的目的是表明代碼應該以“嚴格模式”執行。

使用嚴格模式,您不能使用未聲明的變量。

為何選擇嚴格的模式?

嚴格模式可以更輕鬆地編寫“安全”JavaScript。

嚴格模式將以前接受的“錯誤語法”更改為實際錯誤。

例如,在普通的JavaScript中,錯誤輸入變量名稱會創建一個新的全局變量。在嚴格模式下,這將引發錯誤,從而無法意外創建全局變量。

在普通的JavaScript中,開發人員不會收到任何錯誤反饋,將值分配給不可寫屬性。

在嚴格模式下,對非可寫屬性,僅getter屬性,不存在的屬性,不存在的變量或不存在的對象的任何賦值都將引發錯誤。

請參閱http://www.w3schools.com/js/js_strict.asp了解更多信息




"use strict"使JavaScript代碼以嚴格模式運行,這基本上意味著在使用之前需要定義所有內容。使用嚴格模式的主要原因是為了避免未定義方法的意外全局使用。

在嚴格模式下,事情運行得更快,一些警告或靜默警告會導致致命錯誤,最好總是使用它來製作更整潔的代碼。

"use strict"在ECMA5中廣泛需要使用在ECMA6中它默認是JavaScript的一部分,所以如果你使用ES6則不需要添加它。

查看來自MDN的這些陳述和示例:

“use strict”指令
“use strict”指令是JavaScript 1.8.5(ECMAScript第5版)中的新指令。它不是一個語句,而是一個文字表達式,被早期版本的JavaScript忽略。“use strict”的目的是表明代碼應該以“嚴格模式”執行。使用嚴格模式,您不能使用未聲明的變量。

使用“use strict”的例子:
函數的嚴格模式:同樣,要為函數調用嚴格模式,請輸入確切的語句“use strict”; (或'use strict';)在任何其他語句之前在函數體中。

1)功能嚴格模式

 function strict() {
     // Function-level strict mode syntax
     'use strict';
     function nested() { return 'And so am I!'; }
     return "Hi!  I'm a strict mode function!  " + nested();
 }
 function notStrict() { return "I'm not strict."; }

 console.log(strict(), notStrict());

2)全腳本嚴格模式

'use strict';
var v = "Hi! I'm a strict mode script!";
console.log(v);

3)分配給不可寫的全局

'use strict';

// Assignment to a non-writable global
var undefined = 5; // throws a TypeError
var Infinity = 5; // throws a TypeError

// Assignment to a non-writable property
var obj1 = {};
Object.defineProperty(obj1, 'x', { value: 42, writable: false });
obj1.x = 9; // throws a TypeError

// Assignment to a getter-only property
var obj2 = { get x() { return 17; } };
obj2.x = 5; // throws a TypeError

// Assignment to a new property on a non-extensible object.
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = 'ohai'; // throws a TypeError

您可以在MDN上閱讀更多內容




比較小例子:

非嚴格模式:

for (i of [1,2,3]) console.log(i)

// output:
// 1
// 2
// 3

嚴格模式:

'use strict';
for (i of [1,2,3]) console.log(i)

// output:
// Uncaught ReferenceError: i is not defined



use strict 是一種讓你的代碼更安全的方法,因為你不能使用危險的功能,這些功能可能不會像你期望的那樣工作。並且在它使代碼更加嚴格之前被編寫。




使用Strict用於顯示常見錯誤和重複錯誤,以便以不同方式處理,並更改java腳本運行的方式,此類更改包括:

  • 防止偶然的全局變量

  • 沒有重複

  • 消除

  • 消除這種脅迫

  • 更安全的評估()

  • 不可變的錯誤

您還可以閱讀這篇article了解詳情




在ECMAScript 5中引入了JavaScript“嚴格”模式。

  (function() {
  "use strict";
   your code...
   })();

寫“使用嚴格”; 在JS文件的最頂層打開嚴格的語法檢查。它為我們完成以下任務:

(i)如果您嘗試分配未聲明的變量,則會顯示錯誤

(ii)阻止您覆蓋關鍵的JS系統庫

(ii)禁止一些不安全或容易出錯的語言功能

“use strict”也適用於個別功能。在代碼中包含“嚴格使用”總是更好的做法。

瀏覽器兼容性問題:“use”指令旨在向後兼容。不支持它們的瀏覽器只會看到一個未被進一步引用的字符串文字。所以,他們會過去並繼續前進。




Related

javascript syntax jslint use-strict