深入浅析JS中的严格模式


Posted in Javascript onJune 04, 2018

什么是严格模式?

使JS编码更加规范化的模式,消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为

怎么使用?

直接添加下面的这句字符串就可以了,这种语法可以向后兼容,如果是不支持严格模式的javascript引擎,就会直接当成是一个未赋值的字符串字面量,会直接忽略,支持的引擎就会开启严格模式

'use strict'

说明:

1.在全局作用域使用的话,那整个js脚本就会开启这种模式

2.如果是只在函数内部使用的话,那么就只是该函数内部开启而已

function doSomething(){
 'use strict' 
 // 其他代码 
}

变量

1. 在严格模式中什么时候创建变量以及怎么创建变量都是有限制的.首先,不允许意外创建全局变量.在非严格模式下是可以像下面这样创建全局变量,但是严格模式中是不可以的

// 未声明变量
// 非严格模式:创建全局变量
// 严格模式 :抛出referenceEror错误

2.在严格模式下,对变量名也是有限制.特别的,不能使用implements,interface,let,package,private等保留字作为变量名,用这些变量命名的话,都会导出语法错误

对象

在严格模式下 操作对象比在非严格模式下更容易导致错误,下面几种情形会导致语法错误

1.为只读属性赋值会抛出TypeError

2.对不可配置的属性使用delete 操作符会抛出TypeError

3.对不可扩展的对象添加属性会抛出TypeError

函数

在严格模式下,要求命名函数的参数必须是唯一的

// 重命名参数的
// 非严格模式:没有错误,只能访问第二个参数,如果要访问第一个参数,就必须通过arguments
// 严格模式语法错误
function sum(num,num){
  //do something   
}

在严格模式下arguments对象的行为也有所不同.在严格模式下,修改命名参数的值也会反映到argument对象中,但是在严格模式下这两个值是完全独立的

function showValue(value){
 value = 'foo'
 console.log(value)
 console.log(arguments[0]) // 非严格模式 : 'foo' 严格模式 :'hello'
  
}   
showValu('hello')
                              

 函数

 在严格模式中,函数的参数必须唯一

// 重名的参数
// 非严格模式中,没有错误,只能访问第一个参数
// 严格模式 :抛出错误 Uncaught SyntaxError: Duplicate parameter name not allowed in this context
function sum(num,num){
  'use strict'
  // do something 
}

arguments对象

在非严格模式中,修改命名参数的值也会反应到arguments对象中,而严格模式坐下,这两个值是完全独立的

// 修改命名参数的值
// 非严格模式:修改会反应到arguments中
// 严格模式中不会反应到arguments中
function sum(num,num2){
  'use strict'
num=3
  console.log(arguments[0],num2)// 严格模式下输出为1,2 非严格模式下输出为3,2
}
sum(1,2)

 eval()

 eval函数最大的变化就是他在包含上下文中不在创建变量或者函数:

// 使用eval函数创建变量
// 非严格模式中:弹出框弹窗 20
// 严格模式中:调用alert(x)时报错
function doSomething(){
  eval('var x=20')
  alert(x)
}

在严格模式中,可以在eval()中声明变量和函数,但这些边行或者函数只能在被求值的特殊作用域中有效,随后就将被销毁,下面这段代码执行就是没问题的

'use strict'
var result=eval('x=1,y=13;x+y')
alert(result)

在这里,eval中声明了变量x和y,然后将他们加在一起,反悔了他们的和,于是result变量的值就是21,即x+y的结果,在调用alert时,尽管x和y已经不存在了,result变量的值还是有效的

抑制this

在非严格模式下使用函数的apply()或则call()方法时,null和undefined值会被转换为全局对象,而在严格模式下,函数的this值始终是指定的值,无论指定的是什么值:

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

其他变化

在严格模式中with语句被抛弃掉了,在非严格模式中with语句能够改变解析标识符的路径,但在严格模式下,with语句被简化掉了,因此,在严格模式下使用with语句是导致语法错误

// with语句
// 非严格模式:允许
// 严格模式:抛出语法错误
with (location) {
 console.log(href);
}

总结

以上所述是小编给大家介绍的JS中的严格模式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jquery 实现密码框的显示与隐藏示例代码
Sep 18 Javascript
JS小功能(button选择颜色)简单实例
Nov 29 Javascript
jquery浏览器滚动加载技术实现方案
Jun 03 Javascript
jquery Easyui快速开发总结
Aug 20 Javascript
全面解析多种Bootstrap图片轮播效果
May 27 Javascript
DOM 事件的深入浅出(二)
Dec 05 Javascript
JS如何判断浏览器类型和详细区分IE各版本浏览器
Mar 04 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
Aug 03 Javascript
Vue的实例、生命周期与Vue脚手架(vue-cli)实例详解
Dec 27 Javascript
vue.js实现带日期星期的数字时钟功能示例
Aug 28 Javascript
了解JavaScript中let语句
May 30 Javascript
Weex开发之地图篇的具体使用
Oct 16 Javascript
详解如何在你的Vue项目配置vux
Jun 04 #Javascript
详解vue-loader在项目中是如何配置的
Jun 04 #Javascript
vue.js打包之后可能会遇到的坑!
Jun 03 #Javascript
详解vue项目中如何引入全局sass/less变量、function、mixin
Jun 02 #Javascript
vue之将echart封装为组件
Jun 02 #Javascript
React学习笔记之高阶组件应用
Jun 02 #Javascript
浅谈node中的cluster集群
Jun 02 #Javascript
You might like
WordPress中获取所使用的模板的页面ID的简单方法
2015/12/31 PHP
ThinkPHP的SAE开发相关注意事项详解
2016/10/09 PHP
PHP实现压缩图片尺寸并转为jpg格式的方法示例
2018/05/10 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
2019/09/29 PHP
用JavaScript编写COM组件的步骤
2009/03/17 Javascript
页面只有一个text的时候,回车自动submit的解决方法
2010/08/12 Javascript
js通过googleAIP翻译PHP系统的语言配置的实现代码
2011/10/17 Javascript
jQuery动画效果animate和scrollTop结合使用实例
2014/04/02 Javascript
一个简单的jQuery计算器实现了连续计算功能
2014/07/21 Javascript
jquery获得当前html页面源码的方法
2015/07/14 Javascript
Vue实现路由跳转和嵌套
2017/06/20 Javascript
解决Vue页面固定滚动位置的处理办法
2017/07/13 Javascript
认识less和webstrom的less配置方法
2017/08/02 Javascript
浅谈Vue下使用百度地图的简易方法
2018/03/23 Javascript
JS实现的base64加密解密操作示例
2018/04/18 Javascript
vue2.0父子组件间传递数据的方法
2018/08/16 Javascript
详解微信小程序回到顶部的两种方式
2019/05/09 Javascript
react 中父组件与子组件双向绑定问题
2019/05/20 Javascript
简述pm2常用命令集合及配置文件说明
2019/05/30 Javascript
JavaScript代码异常监控实现过程详解
2020/02/17 Javascript
jQuery带控制按钮轮播图插件
2020/07/31 jQuery
用Javascript实现发送短信验证码间隔功能
2021/02/08 Javascript
[57:18]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#3VP VS VG
2016/03/03 DOTA
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
python分析apache访问日志脚本分享
2015/02/26 Python
Python最火、R极具潜力 2017机器学习调查报告
2017/12/11 Python
在Python中如何传递任意数量的实参的示例代码
2019/03/21 Python
django执行数据库查询之后实现返回的结果集转json
2020/03/31 Python
python matplotlib绘制三维图的示例
2020/09/24 Python
基于IE10/HTML5 开发
2013/04/22 HTML / CSS
Myprotein瑞典官方网站:畅销欧洲英国运动营养品牌
2018/01/22 全球购物
100%法国制造的游戏和玩具:Les Jouets Français
2021/03/02 全球购物
介绍一下mysql的日期和时间函数
2013/03/28 面试题
外贸专业求职信
2014/03/09 职场文书
2015年宣传思想工作总结
2015/05/22 职场文书
2016领导干部廉洁自律心得体会
2016/01/13 职场文书