严格模式:“use strict”
【1】使用方式是将“use strice”字符串放入脚本代码中, 放在顶部表明整个脚本启用严格模式,放在某函数体(函数声明)内的第一行,则指定该函数执行严格模式,其余脚本代码不受影响。
【2】不支持strict模式的浏览器会把“use strict”当做一个字符串语句执行,支持strict模式的浏览器将开启严格模式
【3】IE10+ 支持严格模式
【4】消除js语法的一些不合理、不严谨、不安全问题,减少怪异行为并保证代码运行安全,提高编译器效率,增加运行速度
严格模式下的十大规则:
【1】变量:【a】不允许意外创建全局变量(未定义的变量) 【b】不能对变量调用delete操作符
"use strict" [a] message = 'hello world!'; [b] var color = ''red; delete color; // delete 删除变量
【2】对象:【a】不能为只读属性赋值【b】不能为不可配置的属性使用delete操作
"use strict" var person = { name: 'cook', }; // Object.defineProperty(obj, key, descriptor) 设置对象某个属性的描述符(value, 读,写是否可被遍历)
// 注意:使用该方法时,所有描述符皆默认为false,但创建变量时,变量的描述符皆默认为true---值只能是布尔类型的描述符。 Object.defineProperty(person, 'name', { writable: false, // 属性是否可被赋值运算修改 configurable: false, // 属性描述符是否可被修改,属性是否可被删除 }); //[a] person.name = 'Nicholas'; //[b] delete person.name
【3】函数:【a】参数必须唯一 【b】修改形参不会反映到arguments中 【c】不允许使用arguments.callee和arguments.caller 【d】 不允许函数内部遍历调用栈(查阅)
"use strict" 【a】 function sum(num,num){} 【b】 // arguments 存储的实际是传递给函数的参数(实参),而不是函数声明的参数(形参)。这句话在严格模式被更为贴切的执行。 //小技巧 使用instanceo判断arguments是否是数组,答案是否,它是一个类似数组(类数组)的集合。 funciton showValue(value) { value = "Foo"; alert(arguments[0]); // Hi alert(value); // Foo } showValue('Hi'); 【c】 // callee 正被执行的function对象;caller保存调用该函数的函数,如果没有,则为null。 function outer() { inner(); return argumnets.callee(num); } function inner() { alert(inner.caller()); } outer();
【d】
function f1() {
f1.caller;
f1.arguments;
return arguments.callee;
}
【4】严格模式下,eval()语句本身成为一个单独的作用域,它所生成的变量只能用于eval内部。
"use strict" // eval() 将字符串转化为 html,并自动执行 function () { eval("var x = 10"); alert(x); } eval("var y = 20"); alert(y); // 允许以下操作 var result = eval("var x = 10, y = 11; x+y"); alert(result); //21
【5】不允许使用eval和arguments作为标识符(保留字也不可以),也不允许读写他们的值
"use strict" // 用来承载数据的变量,我们将其称为标识符 var eval = 10; var arguments = 20;
// 保留字: implements,interface,let,package,private,protected,public,static,yield
【6】 静止使用with语句
"use strict"
// 将'{}'内的this指向'()'内的对象---将代码的作用域设置到一个特定的作用域。 var v = 1; with (o) { // 语法错误 v = 2; }
【7】禁止this关键字指向全局对象
"use strict" // 非严格模式下 此this指向window var color = "red"; function fn() { alert(this.color); // 等用于undefined.color 报错 } fn();
【8】禁止八进制表示法
"use strict"; var n = 0100; // 语法错误
【9】函数必须声明在顶层
"use strict" if (true) { function f() {} } for (var i = 0; i < 5; i++) { function f2() {} }
ES6引入“块级作用域”。为了与ES6接轨,严格模式只允许在全局作用域或函数作用域的顶层声明函数;不允许在代码块内声明函数。
代码出至: 小火柴的蓝色理想