早已习惯在use strict模式下编写JavaScript代码,也知道它的一些约束,特性。今日在看视频时竟收获了几个原来不曾知道的特性。
首先科普下JavaScript的严格模式。
它修复了部分语言上的不足, 提供更强的错误检查,并增强安全性。
严格模式可使用在某个函数内部,也可使用在整个脚本中。开启严格模式的语法为‘use strict’。
function foo(){ 'use strict'; }
'use strict'; function foo(){ }
介绍就到这,如还未使用的伙伴可自行搜索:JavaScript 严格模式。
一.use strict前不可写var b;
我知道在定义'use strict'前仍可写代码(即无需写在代码的第一行),但不知道在'use strict'前输入
var a;
类似代码,则不行。
二.use strict下,不允许有8进制数。
function foo(){
'use strict';
console.log(0321);
}
以上代码,则会报错。Uncaught SyntaxError: Octal literals are not allowed in strict mode.
三.use strict下,eval、arguments成了关键字,不能作为变量函数名。
function f(){ 'use strict'; function eval(){ console.log(eval); } }
以上代码,依旧会报错。Uncaught SyntaxError: Unexpected eval or arguments in strict mode
四.use strict下,eval变成了独立作用域
!function(){ "use strict"; eval('var evalVal=2;’); console.log(typeof evalVal); //number }();
在一般模式下,在eval所在的函数内可得到evalVal,则会打印number;在 严格模式下eval中的代码会在独立作用域中执行,所以在外面evalVal则拿不到。即为undefined。
以上便是今日通过慕课网视频中学习而得。其外严格模式下还有很多限制,约束特性。如Bosn老师在PPT中写道的:
所有变量必须声明, 赋值给为声明的变量报错,而不是隐式创建全局变量。
eval中的代码不能创建eval所在作用域下的变量、函数。而是为eval单独创建一个作用域,并在eval返回时丢弃。
函数中得特殊对象arguments是静态副本,而不像非严格模式那样,修改arguments或修改参数变量会相互影响。
删除configurable=false的属性时报错,而不是忽略
禁止八进制字面量,如010 (八进制的8)
eval, arguments变为关键字,不可作为变量名、函数名等
一般函数调用时(不是对象的方法调用,也不使用apply/call/bind等修改this)this指向null,而不是全局对象。
若使用apply/call,当传入null或undefined时,this将指向null或undefined,而不是全局对象。
试图修改不可写属性(writable=false),在不可扩展的对象上添加属性时报TypeError,而不是忽略。
arguments.caller, arguments.callee被禁用
其中一些早已用熟,此处便未贴上代码解释。
最后,严格模式的向上兼容的。