JS严格模式和正常模式有哪些语法区别?

官方在ES5添加“严格模式”这种运行模式的目的:

  • 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
  • 消除代码运行的一些不安全之处,保证代码运行的安全;
  • 提高编译器效率,增加运行速度;
  • 为未来新版本的Javascript做好铺垫。

使用严格模式很简单,只需下面这个标志:

	"use strict";

我们重点学习的是严格模式和正常模式在语法上有什么差别。

1.全局变量必须显式声明

在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,全局变量必须显式声明。

示例:

"use strict";

	name="xiaomi";//报错,name未声明
	
	for(item in array){
	//报错,item未声明
	}

在严格模式下,变量都必须先用var、let或const声明,然后再使用。

2.禁止动态绑定

动态绑定:即某些属性和方法到底属于哪个对象,不是在编译时确定,而是在运行时确定。

好处:在编译时就确定属性与方法到底归属哪个对象,有利于编译效率的提高,也有助于代码的阅读。

哪些使用了动态绑定?

1.with语句

"use strict";

var obj={
	name:'xiaomi',
	count:12
};
//使用with语句报错
with(obj){
	name:'xiaowang',
	sex:"男"
}

为什么使用with语句,不确定属性的归属呢?

很简单,在正常模式下:with绑定的是obj对象,name属性在obj中,则修改name属性的值,而sex不在obj中,则最终会将sex声明为为全局变量。

2.eval作用域

正常模式下:eval语句的作用域取决于它处于全局作用域,还是函数作用域。

严格模式下:eval语句本身就是一个作用域,它生成的变量只能在eval内部使用。

"use strict";

var name='xiaoming';

console.log(eval("var name='xiaohua';name"))//'xiaohua'

console.log(name);//'xiaoming'

3.禁止this指向全局对象,而是指向undefined

var name="xiaoming";
function foo(){
	console.log(this.name);//'xiaoming',this指向window
}

function foo(){
	"use strict";
	console.log(this.name);//抛出错误,因为this为undefined
}

4.禁止删除变量

严格模式下,声明的变量无法被删除,但对象中的属性,若设置了configurable为true,即可配置,那么这个对象的属性是可以被删除的。

 "use strict";
  var name;
  delete name; // 语法错误
  var obj = Object.create(null, {'count': {
      value: 1,
      configurable: true
  }});
  delete obj.count; // 删除成功

5.函数声明必须在顶层

所谓的顶层是在全局中声明,即在块作用域中声明是错误的。

"use strict";
var name='xiaoming'
  if (name==='xiaoming') {
    function func() { } // 语法错误
  }
  for (let i = 0; i < name.length; i++) {
    function func() { } // 语法错误
  }

6.禁止变量或函数参数重名

重名:在同一作用于,两个或两个以上变量名相同。

正常模式下,如果对象有多个重名属性,那么最后一个会覆盖前面的值。

但在严格模式下这是会报错的。

"use strict";
var obj={
	name:"xiaoming",
	name:"xiaohua"
};//报错

正常模式下:在函数参数中,如果参数有重名情况,我们可以使用arguments[i]读取参数,以便区分参数

function foo(a,b,b,c){
	console.log(arguments[0]);//a
	console.log(arguments[1]);//第一个b
	console.log(arguments[2]);//第二个b
	console.log(arguments[3]);//c
}

上面重复参数名,在严格模式下报错。

7.限制了arguments对象

1.不允许对arguments赋值

正常模式下:
        function foo(a,b){
            console.log("赋值前:",arguments)
            arguments=12;
            console.log("赋值后:",arguments)
        }
        foo(1,2);

在这里插入图片描述
严格模式下会报错。

2.arguments不再跟踪参数的变化

        function foo(a,b){
            a=11;
            b=22;
            return arguments;
        }
        console.log("正常模式下:",foo(1,2))

        function bar(a,b){
            "use strict";
            a=33;
            b=44;
            return arguments;
        }
        console.log("严格模式下:",bar(3,4));

在这里插入图片描述
严格模式下,a,b已经重新赋值,但是arguments没有记录它们的变化。

我目前大概了解的就这些,日后再更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值