JavaScript 中的“use strict”有什么作用,其背后的原因是什么?
在本教程中,我们将学习 JavaScript 中“use strict”的作用。
“use strict”是一个指令。它起源于 JavaScript 1.8.5。
use strict 指令规定 JavaScript 代码必须在严格模式下运行。严格模式指令不是语句,而是一个常量表达式。早期的 JavaScript 版本会忽略此表达式。
在严格模式下编写代码时,我们不能使用未声明的变量。除了 IE9 及以下版本,所有现代浏览器都支持此 JavaScript 指令。严格模式允许我们编写更简洁的代码,因为它会在程序中使用未声明的变量时抛出错误。
“use strict”是一个字符串。要启用严格模式,我们需要将此字符串写在脚本的开头。写在开头意味着它具有全局作用域。
使用此 JavaScript 指令的优点是我们可以获得安全的代码。早期的 JavaScript 版本会忽略错误的语法。例如,以前,错误键入的变量名会变成全局变量。在严格模式下,它会为此变量抛出错误,我们可以纠正它。JavaScript 函数在必要时也会使用严格模式。
用户可以按照以下语法使用此方法。
语法
"use strict"; const a = "Strict Variable";
此处,语法中的第一行是指令,a 是遵循严格模式的变量。
示例 1
此程序在普通模式下有一个未声明的变量 q,在严格模式下有一个未声明的变量 p。在非严格模式下,我们可以显示 q 的值。当用户选择严格模式时,我们无法显示 p 的值;相反,它会在 catch 块中抛出错误。
<html> <body> <h2>Using JavaScript strict mode</h2> <p id = "strictModInp"></p> <div id = "strictModOutWrap"> <h3>Click this button to strict mode</h3> <button id = "strictModBtn" onclick = "getStrictMode();">Be Strict </button> </div> <p id = "strictModOut"></p> <script> var strictModEl; var strictModData; var strictModWrap = document.getElementById("strictModOutWrap"); function getStrictMode() { "use strict"; try { p = 10; strictModData = "Undeclared variable in strict mode -
" + p; } catch(e) { strictModData = "Undeclared variable in strict mode -
" + e; } strictModEl = document.getElementById("strictModOut"); strictModEl.innerHTML = strictModData; // strictModWrap.style.display = "none"; } function noStrict() { q = 10; strictModEl = document.getElementById("strictModInp"); strictModData = "Undeclared variable in normal mode -
" + q; strictModEl.innerHTML = strictModData; } noStrict(); </script> </body> </html>
示例 2
此程序有四个严格模式会抛出错误的情况。我们使用 try-catch 块将此错误显示给用户。您可以参考程序下面内联的每个情况注释。
<html> <body> <h2>Using the JavaScript strict mode restriction cases.</h2> <p id = "useStrictInp"></p> <div id = "useStrictOutWrap"> <h5>Click this button to strict mode</h5> <button id = "useStrictBtn" onclick="strictUse();"> Strict </button> </div> <p id = "useStrictOut"> </p> <script> var useStrictEl; var useStrictData; var useStrictWrap = document.getElementById("useStrictOutWrap"); var useStrictOut = document.getElementById("useStrictOut"); var useStrictErr = ""; function strictMode(option) { 'use strict'; try { switch(option) { case 1: //must declare a variable a = 'hi'; break; case 2://must declare an object jsonObj = {name: 'Carla', age: 25}; break; case 3://must not assign to the non-writable property let obj1 = {}; Object.defineProperty(obj1, 'x', { value: 40, writable: false }); obj1.x = 10; break; case 4://must not assign to a getter-only property let obj2 = { get x() { return 10; } }; obj2.x = 5; break; } } catch(e) { useStrictErr += e + "<br><br>"; } useStrictOut.innerHTML = useStrictErr; } function strictUse() { strictMode(1); strictMode(2); strictMode(3); strictMode(4); } </script> </body> </html>
严格模式中的其他限制
我们不能赋值给变量“arguments”
'use strict'; let arguments = 'hello'; //error let eval = 44;
我们不能使用八进制值
'use strict'; let a = 010; //error
我们不能使用转义字符
'use strict'; let a = \010; //error
我们不能为不可扩展的对象分配新属性
'use strict'; let obj = {}; Object.preventExtensions(obj); obj.newKey = 'test'; //error
我们不能使用重复的参数
"use strict"; function hello(p1, p1) { console.log('hello') }; //error hello();
我们不能删除对象
'use strict'; let person = {name: 'Egan'}; delete person; //error
我们不能使用未声明的变量
"use strict"; var x = 1; //valid y = 1;//invalid
我们不能使用关键字
"use strict"; var for = 1; //error var if = 1;
我们不能赋值给只读对象
"use strict"; var arr = [10,20,30]; arr.length = 10;
我们不能使用“with”
"use strict"; with (Math) { x = abs(200.234, 2); //error };
我们不能使用“eval”
"use strict"; eval("var x = 1");
函数内的严格模式
x = 1; //valid function sum(val1, val2) { "use strict"; result = val1 + val2;//error return result; }
我们不能删除原型
"use strict"; delete Object.prototype;
我们不能删除未限定的标识符。
"use strict"; function f(a, b) { delete(a); //error }
我们不能删除未限定的标识符、函数或对象
"use strict"; var x = 50; var obj = { 'name': 'name' }; function f() { } delete x; //error delete obj; //error delete f; //error,
要在某些控制台中使用严格模式,请使用此代码块
(function() { 'use strict'; //code here... })()
在本教程中,我们学习了 JavaScript 中的严格模式,它限制了未声明变量的使用。使用严格模式,我们可以确保代码安全和简洁。严格模式很有用,因为它可以防止错误。