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 严格模式就介绍到这了。

回复

我来回复
  • 暂无回复内容