Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

严格模式和非严格模式 #49

Open
wuyanqian0503 opened this issue Jun 21, 2021 · 0 comments
Open

严格模式和非严格模式 #49

wuyanqian0503 opened this issue Jun 21, 2021 · 0 comments

Comments

@wuyanqian0503
Copy link
Owner

严格模式的概念,是从ECMAScript5引入的,通过严格模式,可以在函数内部选择进行较为严格的全局或局部的错误条件检测

使用严格模式的好处是可以提早知道代码中存在的错误,及时捕获一些可能导致编程错误的 ECMAScript 行为。

如何使用严格模式

支持严格模式的浏览器包括 IE10+、Firefox 4+、Safari 5.1+和 Chrome。

使用严格模式的编译指示(pragma):"use strict" 可以告诉引擎在当前作用域中进行严格模式。

比如在文件顶部开启严格模式,则由于es6中一个文件就是一个模块,具有自己的作用域,所以在整个模块的作用域中都将采用严格模式,再比如在全局作用域中编写,则会对全局都生效。甚至可以在一个函数中打开严格模式,就像下面这样:

function test(){ 
  "use strict";
  // ......
}

严格模式和非严格模式的区别

变量

严格模式下:

  • 不允许意外创建变量,必须要有var、let或const等关键字来声明
  • 不允许对原始值变量进行delete操作
  • 不允许使用保留字作为变量名

对象

严格模式下:

  • 操作只读属性赋值会抛出 TypeError;
  • 对不可配置的(nonconfigurable)的属性使用 delete 操作符会抛出 TypeError;
  • 为不可扩展的(nonextensible)的对象添加属性会抛出 TypeError。
  • 在使用对象字面量时,属性名必须唯一。

函数

严格模式下:

  • 命名函数的参数必须唯一
  • 函数体中的 arguments对象中的参数 与 函数参数是 独立的
  • if 语句中声明函数会导致语法错误

this

在非严格模式下使用函数的 apply()或 call()方法时,null 或 undefined 值会被转换为全局对象。

在严格模式下,函数的 this 值始终是指定的值,无论指定的是什么值。例如:

//访问属性
//非严格模式:访问全局属性
//严格模式:抛出错误,因为 this 的值为 null
var color = "red";
function displayColor(){
   alert(this.color);
}
displayColor.call(null);

以上代码向displayColor.call()中传入了null,
如果在是非严格模式下,这意味着函数的this值是全局对象。结果就是弹出对话框显示"red"。
而在严格模式下,这个函数的 this 的值是 null,因此在访问 null 的属性时就会抛出错误。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant