JavaScript 教程

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 Break JS 类型转换 JS 位运算符 JS 正则表达式 JS 错误处理 JS 作用域 JS Hoisting JS 严格模式 JS this 关键词 JS Let 关键词 JS Const 关键词 JS 箭头函数 JS 类 JS 调试 JS 样式指南 JS 最佳实践 JS 常见错误 JS 性能优化 JS 保留关键词 JS 版本 JS ES5 JS ES6 JS JSON

JS 表单

JS Forms Forms API

JS 对象

Object 对象定义 Object 对象属性 Object 对象方法 Object Display Object 对象访问器 Object 对象构造器 Object 对象原型 Object ECMAScript 5

JS 函数

JS 函数定义 JS 函数参数 JS 函数调用 JS Call 函数 JS Apply 函数 JS 函数闭包

JS 类库

Class 类简介 Class 类继承 Class Static

JS 异步

JS 回调 JS 异步 JS Promises JS Async/Await

JS HTML DOM

DOM 简介 DOM 方法 DOM 文档 DOM 元素 DOM HTML DOM CSS DOM 动画 DOM 事件 DOM 事件监听 DOM 导航 DOM 节点 DOM 集合 DOM 节点列表

JS 浏览器 BOM

JS Window JS Screen JS Location JS History JS Navigator JS 弹出框 JS Timing JS Cookies

JS AJAX

AJAX 简介 AJAX XMLHttp AJAX 请求 AJAX 响应 AJAX XML 文件 AJAX PHP AJAX ASP AJAX 数据库 AJAX 应用程序 AJAX 实例

JS JSON

JSON 简介 JSON 语法 JSON vs XML JSON 数据类型 JSON 解析 JSON 字符串化 JSON 对象 JSON 数组 JSON PHP JSON HTML JSON JSONP

JS Web APIs

Web API 简介 Web History API Web Storage API Web Geolocation API

JS vs jQuery

jQuery 选择器 jQuery HTML jQuery CSS jQuery DOM

JS 实例

JS 实例 JS HTML DOM JS HTML 输入 JS HTML 对象 JS HTML 事件 JS Browser JS 编辑器 JS 练习 JS 测验

JS 参考手册

JS 对象 HTML DOM 对象



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" 指令只能在脚本或函数的开头被识别。