JavaScript严格模式

严格模式

"use strict"
//下面的代码都是严格模式下的
//如果use strict不在第一行,整个脚本以普通模式运行

(function(){
    //函数中使用严格模式,也必须放在第一行
    "use strict";
})()

严格模式和普通模式的区别

1.严格模式下变量必须先声明后使用,否则报错

"use strict";
var x = 1; //不声明会报错
console.log(x);

//i不声明,会报错
for(i=0;i<10;i++){
    console.log(i);
}

2.严格模式下不能使用width

"use strict";
var obj = {};
obj.a = 1;
obj.b = 2;

//会出错,with会出现内存泄露
with(obj){
     console.log(a+b);
}

3.严格模式下禁止了this指向全局对象

普通模式下:全局作用域和函数作用域

"use strict";
var fn = function(){
    console.log(this);
}
fn();//undefined,普通模式下为window

//所以构造函数只要不通过new实例化对象,那么就会直接报错,因为undefined无法设置属性

var Cat = function(name){
    this.name = name;
    this.say = function(){
        console.log(this.name)
    }
}
//普通模式下,直接调用函数,this指向为window,所以window有了name和say属性
Cat("mimi");
console.log(window);
console.log(window.name);

//严格模式下,this为undefined,无法对它设置属性

4.严格模式下第三种作用域:eval作用域

//eval语句的作用域,取决于它处于全局作用域,还是函数作用域,严格模式下eval语句本身就是一个作用域,不再能够生成全局变量了,它所生成的变量只能用于eval内部

eval("var x = 200;");
console.log(x);//普通模式下输出:200

"use strict";
var abc = function(){
    eval("var x = 200;");
}
console.log(x);//x is not undefined

5.严格模式下禁止在函数内部遍历调用栈

"use strict";

var fn = function(){
    console.log(fn.arguments.callee.length);//会出错
}
fn();//报错
fn("abc");

6.严格模式下禁止删除变量,可以删除变量的属性

var x = 123;
delete x;
console.log(x);//普通模式下也不能删除变量,但是不报错

var obj = {};
obj.y = 100;
delete obj.y;
console.log(obj.y);//undefined

"use strict";
var x = 123;
delete x;
console.log(x);//严格模式下会报错

var obj = {};
obj.y = 100;
delete obj.y;
console.log(obj.y);//undefined

7.严格模式下,对一个对象的只读属性进行赋值,会报错

8.严格模式下,对禁止扩展的对象添加新属性,也会报错

9.普通模式下,如果对象有多个重名属性,最后赋值的那个属性会覆盖前面的值,而在严格模式下,属于语法错误

"use strict";

var  o = {
    x:200;
    x:300;
    
}
console.log(o);//会报错

10.普通模式下,如果函数有多个重名的参数(可以用arguments[i]读取),严格模式下。属于语法错误

"use strict";

var fn = function(x,x,y){
    console.log(x+y);
}
fn(1,2,2);//普通模式下4,严格模式下报错

11.严格模式下禁止八进制表示法

普通模式下,整数的第一位如果为0,表示这是八进制数,比如0100等于十进制的64,严格模式下将报错

"use strict";

var x = 0100;
console.log(x);

12.严格模式下arguments对象的限制

1.不允许对arguments赋值

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

3.禁止使用arguments.callee,这意味着,我们无法在匿名函数内部调用自身了,没有办法递归了

"use strict";
var fn = function(){
    arguments = 100;//出错
}
fn();

var fn = function(num){
    num+=100;
    console.log(num);//普通模式下200 ,严格模式下 200
    console.log(arguments[0]);//普通模式下200  严格模式下 100
}
fn(100);

var num = 0;
(function(num){
    num++;
    if(num<=5){
       console.log(numm);
        arguments.callee(numm);
       }
})()

13.函数声明必须在顶层

将来JavaScript的新版本会引入"块级作用域",为了与新版本接轨,严格模式只允许在全局作用域或函数作用域的顶层声明函数,即不允许在非函数的代码块内声明函数

var a = 6;
if(a>5){
    function fn()}{
        console.log("严格模式下,我不应该在这里被声明");
    }
    (function(){
        console.log("我是匿名函数,我在严格模式下可以在这里被声明")
    })()
   }

14.不允许使用关键字

为了向将来JavaScript的新版本过渡,严格模式新增了一些保留字:implements interface let package private protected public static yield

"use strict";
var interface = "interface";
console.log(interface);//报错

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值