严格模式与非严格模式

本文链接:

https://lienjack.github.io/Blog/knowledge/js/3.this.html#%E4%B8%A5%E6%A0%BC-%E9%9D%9E%E4%B8%A5%E6%A0%BC%E6%A8%A1%E5%BC%8F

https://www.jianshu.com/p/39e295f4526d

自执行函数

// 非严格模式:
(function a() {
   console.log(this)//window
})()
----------
 // 严格模式:
 "use strict";
(function a() {
    console.log(this)//undefined
})() 

方法执行

// 非严格
var fn=function () {
   console.log(this)
};
fn();//window
-----------------
// 严格模式
"use strict";
var fn=function () {
    console.log(this)
};
fn();//undefined

总结 非严格this是指向window,严格模式下this是undefined

(1)不使用var声明变量严格模式中将不通过,在循环中如果没有声明变量在非严格模式中很危险,i 会不小心溢出成为全局变量,但在严格模式中会报错,严格模式中变量必须显示声明(var/let/const)

(2)JS中作用域有两种,全局作用域和函数作用域。严格模式带来了第三种作用域:eval作用域,则任何使用'eval'的操作都会被禁止,(eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码,不常用容易报错),在严格模式下,arguments和eval是关键字,不能被修改,不能做变量处理

(3)with()被禁用:with 语句用于设置代码在特定对象中的作用域。with 语句是运行缓慢的代码块,尤其是在已设置了属性值时。大多数情况下,如果可能,最好避免使用它。

(4)caller/callee 被禁用

(5)对禁止扩展的对象添加新属性会报错:Object.preventExtensions(obj);然后对obj增加属性则会报错

(6)删除系统内置的属性会报错

(7)delete使用var声明的变量或挂在window上的变量报错

(8)delete不可删除属性(isSealed或isFrozen)的对象时报错(Object.isSealed() 方法判断一个对象是否被密封。Object.isFrozen()方法判断一个对象是否被冻结。)

(9)对一个对象的只读属性进行赋值将报错(Object.defineProperty(obj, 'a', {value: 1, writable: false})然后对obj属性修改则会报错)

(10)对象有重名的属性将报错

(11)函数有重名的参数将报错,在严格模式下,函数的形参也不可以同名

(12)八进制表示法被禁用

(13)arguments严格定义为参数,不再与形参绑定

(14)一般函数声明都在最顶层,ES5前的JS宽松,你可以写在if或for内(强烈鄙视这种写法)。当然Firefox的解析方式与其他浏览器不同,而在严格模式中这些写法将直接报错

(15)ES6里新增的关键字不能当做变量标示符使用,如implements, interface, let, package, private, protected, public, static, yield

(16)call/apply的第一个参数直接传入不包装为对象

(17)call/apply/bind的第一个参数为null/undefined时,this为null/undefined

不积跬步无以至千里
原文地址:https://www.cnblogs.com/lyt0207/p/12083685.html