严格模式与非严格模式

本文链接:

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

时间: 2024-10-14 08:46:25

严格模式与非严格模式的相关文章

XCode工程中ARC模式与非ARC模式共用(转)

Xcode 项目中经常会融合一些老的代码,它们可能采用非ARC的模式.混合编译时,就会碰到编译出错的情况. 如何共用ARC模式和非ARC模式呢? XCode除了提供整个项目是否使用ARC模式的选择外,还可以对单个文件添加标签来指定是否采用ARC模式. 添加标签的方法: 打开:你的target -> Build Phases -> Compile Sources. 双击对应的 *.m 文件 在弹出窗口中输入上面提到的标签-fobjc-arc / -fno-objc-arc (1)如果你的项目使用

Oracle归档模式与非归档模式设置

(转自:http://www.cnblogs.com/spatial/archive/2009/08/01/1536429.html) Oracle的日志归档模式可以有效的防止instance和disk的故障,在数据库故障恢复中不可或缺,由于oracle初始安装模式为非归档模式,因此需要将其设置为归档模式,下面就其方法和步骤做一些总结,虽然简单,但这是管理oracle数据库必备之工,故有如下陈述. 例子是建立在windowsXP和oracle11g的环境下,如有环境不同,仅供参考. Oracle

oracle11g设置归档模式和非归档模式

1.首先查看当前数据库是否处于归档模式 可使用如下两种方式查看 1.1 select name, log_mode from v$database; log_mode的值为 NOARCHIVELOG 表示数据库处于非归档模式 log_mode的值为 ARCHIVELOG 表示数据库处于归档模式 1.2 archive log list; (此方法需要 as sysdba) Database log mode 的值为 No Archive Mode Automatic archival 的值为 D

怎样将Oracle数据库设置为归档模式及非归档模式

1.Oracle日志分类 分三大类: Alert log files--警报日志,Trace files--跟踪日志(用户和进程)和 redo log 重做日志(记录数据库的更改). 归档日志(Archive Log)是非活动的重做日志备份.通过使用归档日志,可以保留所有重做历史记录,当数据库处于ARCHIVELOG模式并进行日志切换时,后台进程ARCH会将重做日志的内容保存到归档日志中,当数据库出现介质失败时,使用数据文件备份,归档日志和重做日志可以完全恢复数据库.在Oracle10g中,只要

MySQL MHA--故障切换模式(GTID模式和非GTID模式)

GTID和非GTID故障切换模式选择 MySQL 5.6版本引入GTID来解决主从切换时BINLOG位置点难定位的问题,MHA从0.56版本开始支持基于GTID的复制,在切换时可以采用GTID模式和非GTID模式两种模式进行切换,如何在发生故障切换时如何判断采用哪种切换方式呢? 在MHA/MasterFailover.pm的do_master_failover方法中定义了"主库宕机"情况下的故障切换流程,其中第一步就是检查配置文件和确定故障切换模式 相关代码: my ( $server

oracle archivelog模式与非archivelog模式转换

最近集成环境出现归档日志写满后,数据库无法登录情况,询问DBA后查明情况,私下根据DBA的查找方案,拿开发环境做了一下数据库模式的切换,以便做同步监控分析问题,这里给出了数据路 首先使用dba登录,链接到数据库之后使用 sqlplus / as sysdba; archive log list 查看当前数据库归档模式,确实为归档或非归档模式之后.使用 shutdwon immediate 将数据库关闭,然后使用 startup mount 命令将数据开启处于mount状态使用 1 alter d

正则表达式中的贪婪模式与非贪婪模式详解

1 概述 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配.非贪婪模式只被部分NFA引擎所支持. 属于贪婪模式的量词,也叫做匹配优先量词,包括: “{m,n}”.“{m,}”.“?”.“*”和“+”. 在一些使用NFA引擎的语言中,在匹配优先量词后加上“?”,即变成属于非贪婪模式的量词,也叫做忽略优先量词,包括: “{m,n}?”.“{m,}?”.“??”.“*?”和“+?”.

贪婪模式和非贪婪模式

1 package regex; 2 3 import java.util.regex.Matcher; 4 import java.util.regex.Pattern; 5 6 public class regexDemo { 7 public static void main(String[] args) { 8 String str1 = "19900330199012121990111119900220"; 9 String str = "((\\d{4})(\\d

贪婪模式与非贪婪模式

一.概念 1.什么是正则表达式的贪婪与非贪婪匹配 如:String str="abcaxc"; Patter p="ab*c"; 贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配.如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab*c). 非贪婪匹配:就是匹配到结果就好,就少的匹配字符.如上面使用模式p匹配字符串str,结果就是匹配到:abc(ab*c). 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式

归档模式和非归档模式 Oracle 10g学习系列(4)

一.归档模式: Oracle数据库有联机重做日志,这个日志是记录对数据库所做的修改,比如插入,删除,更新数据等,对这些操作都会记录在联机重做日志里.一般数据库至少要有2个联机重做日志组.当一个联机重做日志组被写满的时候,就会发生日志切换,这时联机重做日志组2成为当前使用的日志,当联机重做日志组2写满的时候,又会发生日志切换,去写联机重做日志组1,就这样反复进行. 如果数据库处于非归档模式,联机日志在切换时就会丢弃. 而在归档模式下,当发生日志切换的时候,被切换的日志会进行归档.比如,当前在使用联