轻松上手,快乐学习!

JS 教程

JS 首页JS 教程JS 简介JS 如何使用JS 输出JS 语句JS 语法JS 注释JS 变量JS 运算符JS 算法JS 赋值JS 数据类型JS 函数JS 对象JS 事件JS 字符串JS 字符串方法JS 数值JS 数值方法JS 数组JS 数组方法JS 数组排序JS 数组迭代JS 日期JS 日期格式JS 日期获取方法JS 日期设置方法JS 数学运算JS 随机数JS 布尔运算符JS 比较运算符JS 条件语句JS Switch 语句JS For 循环JS While 循环JS BreakJS 类型转换JS 位运算符JS 正则表达式JS 错误处理JS 作用域JS HoistingJS 严格模式JS this 关键词JS Let 关键词JS Const 关键词JS 箭头函数JS 类JS 调试JS 样式指南JS 最佳实践JS 常见错误JS 性能优化JS 保留关键词JS 版本JS ES5JS ES6JS JSONJS FormsForms APIObject 对象定义Object 对象属性Object 对象方法Object DisplayObject 对象访问器Object 对象构造器Object 对象原型Object ECMAScript 5JS 函数定义JS 函数参数JS 函数调用JS Call 函数JS Apply 函数JS 函数闭包Class 类简介Class 类继承Class StaticJS 回调JS 异步JS PromisesJS Async/AwaitDOM 简介DOM 方法DOM 文档DOM 元素DOM HTMLDOM CSSDOM 动画DOM 事件DOM 事件监听DOM 导航DOM 节点DOM 集合DOM 节点列表JS WindowJS ScreenJS LocationJS HistoryJS NavigatorJS 弹出框JS TimingJS CookiesAJAX 简介AJAX XMLHttpAJAX 请求AJAX 响应AJAX XML 文件AJAX PHPAJAX ASPAJAX 数据库AJAX 应用程序AJAX 实例JSON 简介JSON 语法JSON vs XMLJSON 数据类型JSON 解析JSON 字符串化JSON 对象JSON 数组JSON PHPJSON HTMLJSON JSONPWeb API 简介Web History APIWeb Storage APIWeb Geolocation APIjQuery 选择器jQuery HTMLjQuery CSSjQuery DOMJS 实例JS HTML DOMJS HTML 输入JS HTML 对象JS HTML 事件JS BrowserJS 编辑器JS 练习JS 测验

JS 参考手册

JS 参考手册(类别排序)JS 参考手册(字母排序)


JavaScript 严格模式


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


"use strict" 指令

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

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

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

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

除Internet Explorer 9 及更低版本外,所有现代浏览器都支持"严格使用":

Directive
"use strict" 13.0 10.0 4.0 6.0 12.1

表中的数字指定完全支持该指令的第一个浏览器版本。

您可以在所有程序中使用严格模式。它帮助您编写更清晰的代码,比如防止您使用未声明的变量。

"use strict" 只是一个字符串,所以IE9即使不理解也不会抛出错误。


声明严格模式

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

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

实例

"use strict";
x = 3.14;       // 这将导致错误 because x is not declared
亲自试一试 »

实例

"use strict";
myFunction();

function myFunction() {
  y = 3.14;   // 这也会导致错误 because y is not declared
}
亲自试一试 »

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

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)}; // 这将导致错误

亲自试一试 »

处于安全考虑,不允许 eval() 在其被调用的作用域中创建变量:

"use strict";
eval ("var x = 2");
alert (x);             // 这将导致错误

亲自试一试 »

函数中的 this 关键字在严格模式下的行为不同。

this 关键字指调用函数的对象。

如果未指定对象,则严格模式下的函数将返回 undefined ,而正常模式下的函数将返回全局 object (window):

"use strict";
function myFunction() {
  alert(this); // 将提醒 "undefined"
}
myFunction();

亲自试一试 »


对未来的保障

严格模式中不允许使用为未来预留的关键词。

它们是:

  • implements
  • interface
  • let
  • package
  • private
  • protected
  • public
  • static
  • yield
"use strict";
var public = 1500;      // 这将导致错误

亲自试一试 »

警告!

"use strict" 指令只能在脚本或函数的开头被识别。