JavaScript 严格模式

严格模式:“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接轨,严格模式只允许在全局作用域或函数作用域的顶层声明函数;不允许在代码块内声明函数。

 

代码出至: 小火柴的蓝色理想

posted @ 2018-07-24 11:27  大帝SING  阅读(190)  评论(0编辑  收藏  举报