严格模式
1.开启严格模式的方式
在 script 标签内写入 “use strict”
2.变量必须定以后才能赋值,如果没有定义,但是使用 window 赋值属性,这个变量等同于赋值
3.参数名不能相同
function fn ( a, a ) {
console. log ( a) ;
}
fn ( 3 , 5 ) ;
4.预解析
在栈中将 script 标签中所有使用 var let const 定义的变量预先在栈中开辟空间 起变量名称 然后在 script 标签中所有命名函数赋值给对应的函数变量 函数的预解析区分块语句和全局
5.作用域
var a = 10 ;
{
a = 20 ;
a = 30 ;
function a ( ) {
console. log ( 123 ) ;
}
a = 40 ;
a = 50 ;
console. log ( a, '-----1' ) ;
}
console. log ( a, '-----2' ) ;
严格模式中
如果块语句里存在同名函数会报错 在只有一个函数 a 的情况下,块语句里的任何赋值都不会改变全局变量 非严格模式中
块语句外的变量为最后一个函数上面的赋值 同名函数下面的任何赋值都与外面的变量无关
6.不对只读属性赋值
var str = 'asdasdasd' ;
str. length = 5 ;
7.不能删除不可删除属性
var arr = [ 1 , 2 , 3 ] ;
delete arr. length;
8.不允许使用 8 进制
9.禁止使用 eval
var o1 = { a: 1 } ;
var o2 = { a: 1 } ;
var o3 = { a: 1 } ;
var o4 = { a: 1 } ;
var o5 = { a: 1 } ;
for ( var i = 1 ; i < 6 ; i++ ) {
eval ( 'o' + i) . a = i;
}
console. log ( eval ( 'o' + 1 ) ) ;
console. log ( '3+5' ) ;
console. log ( eval ( '3+5' ) ) ;
10.不能使用 arguments.callee、arguments.callee.callee
11.不允许使用 this
console. log ( this ) ;
function fn ( ) {
console. log ( this ) ;
}
fn ( ) ;