function f(){ return !this;}// 返回false,因为"this"指向全局对象,"!this"就是false function f(){ "use strict"; return !this;}// 返回true,因为严格模式下,this的值为undefined,所以"!this"为true 。因此,使用构造函数时,如果忘了加new,this不再指向全局对象,而是报错 。
function f(){ "use strict";this.a = 1; }; f();// 报错,this未定义(2)禁止在函数内部遍历调用栈
function f1(){ "use strict";f1.caller; // 报错f1.arguments; // 报错 } f1();4.4 禁止删除变量
严格模式下无法删除变量 。只有configurable设置为true的对象属性,才能被删除 。
"use strict"; var x; delete x; // 语法错误 var o = Object.create(null, 'x', { value: 1, configurable: true}); delete o.x; // 删除成功4.5 显式报错
正常模式下,对一个对象的只读属性进行赋值,不会报错,只会默默地失败 。严格模式下,将报错 。
"use strict"; var o = {}; Object.defineProperty(o, "v", { value: 1, writable: false }); o.v = 2; // 报错严格模式下,对一个使用getter方法读取的属性进行赋值,会报错 。
"use strict"; var o = { get v() { return 1; } }; o.v = 2; // 报错严格模式下,对禁止扩展的对象添加新属性,会报错 。
"use strict";var o = {};Object.preventExtensions(o);o.v = 1; // 报错严格模式下,删除一个不可删除的属性,会报错 。
"use strict";delete Object.prototype; // 报错4.6 重名错误
严格模式新增了一些语法错误 。
(1)对象不能有重名的属性
正常模式下,如果对象有多个重名属性,最后赋值的那个属性会覆盖前面的值 。严格模式下,这属于语法错误 。
"use strict";var o = { p: 1, p: 2};// 语法错误(2)函数不能有重名的参数
正常模式下,如果函数有多个重名的参数,可以用arguments[i]读取 。严格模式下,这属于语法错误 。
"use strict"; function f(a, a, b) { // 语法错误return ; }4.7 禁止八进制表示法
正常模式下,整数的第一位如果是0,表示这是八进制数,比如0100等于十进制的64 。严格模式禁止这种表示法,整数第一位为0,将报错 。
"use strict";var n = 0100; // 语法错误4.8 arguments对象的限制
arguments是函数的参数对象,严格模式对它的使用做了限制 。
(1)不允许对arguments赋值
"use strict";arguments++; // 语法错误var obj = { set p(arguments) { } }; // 语法错误try { } catch (arguments) { } // 语法错误 function arguments() { } // 语法错误 var f = new Function("arguments", "'use strict'; return 17;"); // 语法错误(2)arguments不再追踪参数的变化
function f(a) { a = 2; return [a, arguments[0]];} f(1); // 正常模式为[2,2] function f(a) { "use strict"; a = 2; return [a, arguments[0]]; } f(1); // 严格模式为[2,1](3)禁止使用arguments.callee
这意味着,你无法在匿名函数内部调用自身了 。
"use strict"; var f = function() { return arguments.callee; }; f(); // 报错4.9 函数必须声明在顶层
将来Javascript的新版本会引入”块级作用域” 。为了与新版本接轨,严格模式只允许在全局作用域或函数作用域的顶层声明函数 。也就是说,不允许在非函数的代码块内声明函数 。
"use strict"; if (true) {function f() { } // 语法错误 } for (var i = 0; i < 5; i++) {function f2() { } // 语法错误 }4.10 保留字
为了向将来Javascript的新版本过渡,严格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield 。
使用这些词作为变量名将会报错 。
function package(protected) { // 语法错误 "use strict";var implements; // 语法错误 }此外,ECMAscript第五版本身还规定了另一些保留字:class, enum, export, extends, import, super 。它们也是不能使用的 。
推荐阅读
- JS基础入门:事件捕获与事件冒泡
- 抖音:从入门到运营,全攻略
- 玄空风水基础知识的细节精髓
- SQL基础语法
- 一天快速入门python
- 红茶超全的基础知识介绍 了解红茶看这篇就够了
- 古汉语文字学 古汉语文学基础
- 坦洋工夫属于什么茶 坦洋工夫红茶初级入门介绍
- 风水基础知识都要了解什么
- 抖音创作优质内容入门教程 教你做出优质短视频内容
