JavaScript 严格模式
JavaScript 严格模式属于前端实例代码,有关更多实例代码大家可以查看。
所谓的严格模式是在ECMA-262 Edition 5中新增的语法,表示要用严格的javascript语法来执行代码。
下面将继续简单介绍一下严格模式的一些相关内容。
一.声明严格模式:
使用以下语句可以声明严格模式:
"use strict";
特别说明:
在老旧的浏览器中,javascript会将其处理为一行普通的字符串。
二.严格模式的作用范围:
严格模式的作用范围和声明严格模式的语句有着直接的关系。严格模式声明语句只会在它所在的作用域中有效。
如果"use strict";语句在函数中,那么严格模式的影响只会局限于当前函数内,此函数外的其他javascript代码不会受到影响。
如果在全局作用域中声明严格模式,那么所有的javascript代码都会处于严格模式中。
代码实例:
实例一:
"use strict"; console.log("前端教程网");
上面的代码中,将会声明整个脚本都采用严格模式。
特别说明:
声明语句必须要放在脚本的第一行,否则会无效,整个脚本将会以普通的模式运行。当然这个第一行也不是特别的绝对,如果"use strict";语句前面不是产生实际运行结果的语句,那么它可以不是在第一行,例如:
;"use strict"; console.log("前端教程网");
上面的声明语句前面跟着一个空语句。
实例二:
function func(){ "use strict"; return "前端教程网"; }
上面的代码将会声明此函数内将会采用严格模式。
三.严格模式对语法有哪些变化:
原来在普通模式下生效的代码,可能在严格模式下就会报错,下面就简单介绍一下严格模式下有哪些主要的语法上的变化。
1.变量要显示声明:
在普通模式下,声明一个变量可以不适用var,那么这个变量是全局性的,但是在严格模式下,声明变量必须采用显式声明,前面必须要有var,否则会报错。
"use strict"; antzone="前端教程网";
上面的代码会报错,声明变量要使用var。
2.关于动态绑定的限制:
在普通模式下,对于"动态绑定"是非常的灵活宽松的。
所谓的"动态绑定"就是一些属性或者方法是属于哪个对象,不是在编译阶段确定的,而是在运行阶段。
严格模式对"动态绑定"做了一定的限制,也就是说属性或者方法属于哪个对象是在编译阶段就会被确定,优点是能够提高编译的效率,代码也更为安全。下面就是几个具体的规定:
(1).禁止使用width语句:
"use strict"; var antzone = 1; with (obj){ antzone = 2; }
上面的代码会报错。
(2).eval()函数的作用域问题:
在普通模式下,分为局部作用域和全局作用语两种形式。
eval语句的作用域取决于它是处于全局作用域还是局部作用域,但是在严格模式下,eval()会单独形成一个作用域,由它产生的变量只能用于它的内部,代码如下:
"use strict"; var antzone=5; //下面语句输出6 console.log(eval("var antzone= 6;antzone")); //下面语句输出5 console.log(antzone);
3.加强安全性:
(1).禁止this指向window对象:
在普通模式下,函数中的this是可以指向全局对象的,但是在严格模式下是不允许的。
代码如下:
function func(){ "use strict"; return !this; } func();
此函数的返回值是true,因为这个时候this的值是undefined,所以!this的值就是true。
(2).禁止在函数内部遍历调用栈:
function func(){ "use strict"; func.caller;//报错 func.arguments;//报错 } func();
4.限制删除变量:
在普通模式下,可以使用delete语句删除变量和属性,但是在严格模式下这里做了一些限制。
只有configurable属性值为true的对象属性才能够被删除。
"use strict"; var antzone; delete antzone;//语法错误 var obj=Object.create(null,'x',{ value:1, configurable:true }); delete obj.x;//删除成功
5.更严格错误报告:
(1).如果一个对象的属性是只读的,在普通模式下,如果对其赋值,这个时候也是不会报错的,但是在严格模式下将会报错。
代码如下:
"use strict"; var obj={}; Object.defineProperty(obj,"v",{value:1,writable:false}); obj.v=2;
(2).如果一个属性是使用getter方法进行读取的,如果对齐进行赋值也会报错。
代码如下:
"use strict"; var obj = { get v() { return 1; } }; obj.v = 2; // 报错
(3).如果为一个禁止进行扩展的对象新增属性,也会报错。
代码如下:
"use strict"; var o={}; Object.preventExtensions(o); o.v=1;// 报错
(4).对象不能有两个重复的属性名称,否则会报错。
代码如下:
"use strict"; var obj = { antzone: "前端教程网", antzone: "分享互助" };
(5).函数的参数不能够有重复的,否则会报错。
代码如下:
"use strict"; function funct(num, num, m) { return ; }
(6).在严格模式下禁止使用八进制表示法,否则会报错。
代码如下:
"use strict"; var num = 0100;
6.对于arguments对象的一些限制:
在严格模式下,对于arguments对象做了一些特别的限制,下面就简单做一下介绍。
(1).此对象不再追踪函数参数的变化,代码如下:
function func(num){ num=2; return [num,arguments[0]]; } console.log(func(5))
上面是普通模式下,调用函数时候传递的值是5,但是在函数内部做了修改,这个时候能够跟踪变化。但是在严格模式下,参数的变化是不会不追踪的,调用的时候传入的是什么最终还是什么。
(2).禁止使用arguments.callee:
在严格模式下arguments.callee是被禁止使用的。
7.关于函数的声明:
在严格模式下,函数的声明在全局作用域下,由于javascript会在新版本可能会引入块级作用域,也就是说函数不能够声明在出去函数之外的非全局作用域下,代码如下:
"use strict"; if(true) { function f(){ } } for (var i = 0; i < 5; i++) { function f2() { } }
在上面的代码中,由于函数不能够声明在块级作用域,所以会报错。
8.保留字:
在新的javascript版本中,现在的保留字可能会有其他语法用途,所以在严格模式下禁止将保留字用作变量名。
保留字列表如下:
implements, interface, let, package, private, protected, public, static, yield
JavaScript 严格模式,这样的场景在实际项目中还是用的比较多的,关于JavaScript 严格模式就介绍到这了。