严格模式
"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);//报错