JavaScript中有嚴(yán)格模式(strict mode)這個概念,它可以讓JS代碼更加規(guī)范、嚴(yán)謹(jǐn),減少錯誤的發(fā)生。嚴(yán)格模式在進(jìn)行JS代碼開發(fā)時非常實(shí)用,該模式下提供了大量的限制,可以避免一些常見的編程錯誤以及提高代碼的可讀性。
那么,什么是嚴(yán)格模式中的限制呢?下面就來一一介紹。
1. 不允許使用未聲明的變量
在非嚴(yán)格模式中,可以直接給未聲明的變量賦值。例如下方代碼:
message = "Hello, world!"; console.log(message);
而在嚴(yán)格模式中,會拋出ReferenceError(引用錯誤):
"use strict"; message = "Hello, world!"; // ReferenceError
嚴(yán)格模式下,必須使用var、let、const等關(guān)鍵字來聲明變量,避免出現(xiàn)未聲明的情況。
2. 不允許重復(fù)的屬性名或參數(shù)名
在非嚴(yán)格模式下,對象的屬性名或者函數(shù)的參數(shù)名可以重復(fù),例如:
var object = { name: "Alice", name: "Bob" }; console.log(object.name); // "Bob" function test(name, name) { console.log(name); // 20 } test(10, 20);
而在嚴(yán)格模式下,重復(fù)的屬性名或參數(shù)名會導(dǎo)致語法錯誤:
"use strict"; var object = { name: "Alice", name: "Bob" // SyntaxError }; function test(name, name) { // SyntaxError console.log(name); }
3. 禁止使用eval函數(shù)
eval函數(shù)是一種非常危險(xiǎn)的函數(shù),它可以執(zhí)行任何字符串形式的代碼。由于這個函數(shù)的危險(xiǎn)性,嚴(yán)格模式下禁止使用eval函數(shù)。例如下面的代碼:
eval("var message = 'Hello, world';"); console.log(message);
在嚴(yán)格模式下,使用eval會拋出SyntaxError(語法錯誤):
"use strict"; eval("var message = 'Hello, world';"); // SyntaxError console.log(message);
4. 禁止刪除不可刪除的屬性
在JavaScript中,有些屬性是不允許被刪除的,例如對象原型上的屬性。在非嚴(yán)格模式下,嘗試刪除不可刪除的屬性會默默失敗,不會拋出錯誤。而在嚴(yán)格模式下,嘗試刪除不可刪除的屬性會拋出TypeError(類型錯誤)異常。例如下面的代碼:
"use strict"; delete Object.prototype; // TypeError
5. 禁止函數(shù)參數(shù)出現(xiàn)同名屬性
在非嚴(yán)格模式下,函數(shù)參數(shù)名可以與函數(shù)內(nèi)部的變量名重復(fù),例如:
function test(name) { var name = "Alice"; console.log(name); } test("Bob"); // "Alice"
而在嚴(yán)格模式,函數(shù)參數(shù)名和函數(shù)內(nèi)部變量名的重復(fù)將導(dǎo)致語法錯誤:
"use strict"; function test(name) { var name = "Alice"; // SyntaxError console.log(name); } test("Bob");
6. 禁止八進(jìn)制的數(shù)字字面量
在非嚴(yán)格模式下,JavaScript會將數(shù)字字面量中以0開頭的數(shù)字當(dāng)做八進(jìn)制數(shù)來解析。例如下面的代碼:
var num = 01234; // 668十進(jìn)制 console.log(num);
而在嚴(yán)格模式下,八進(jìn)制數(shù)字字面量將被視為語法錯誤:
"use strict"; var num = 01234; // SyntaxError console.log(num);
7. 禁止使用with語句
with語句可以使代碼更加簡潔,但同時也會帶來很多問題。因此,在嚴(yán)格模式下,禁止使用with語句。例如下面的代碼:
"use strict"; var person = { name: "Alice", age: 20 }; with(person) { console.log(name); console.log(age); }
該代碼會拋出SyntaxError異常。
總結(jié)來看,嚴(yán)格模式下提供了很多的限制,可以使JS代碼更加符合標(biāo)準(zhǔn)、可讀性更強(qiáng),減少開發(fā)時出現(xiàn)錯誤的概率。建議在編寫JavaScript的時候?qū)?yán)格模式打開。