Javascript 严格模式use strict详解


Posted in Javascript onSeptember 16, 2017

严格模式:由ECMA-262规范定义的JavaScript标准,对javascrip的限制更强。

(非严格的模式,被称为“马虎模式/稀松模式/懒散模式”。)

一、严格模式的使用

严格模式可以在脚本或函数级别实现。(即全局和局部模式)

1.全局

在js文件的最前面添加    "use strict"

2.局部

在函数内部添加   "use strict",如下

function fn() {
  "use strict";
  //some code
}

二、严格模式和非严格模式的对比

1.严格模式下,无法删除(delete)变量(delete是不合格的标识符))。非严格模式下会删除失败返回false

"use strict";
var x;
delete x;//报错Delete of an unqualified identifier in strict mode.(不合格的标识符)

2.严格模式中,函数形参存在同名的,抛出错误; 非严格模式不会

严格模式下

function fn(a,a){
 "use strict";
  result=a+a;
  console.log(result);
}
fn(2,4);//Duplicate parameter name not allowed in this context(重复的参数名称在此上下文中不允许)

非严格模式下

function fn1(a,a){
  "use strict";
  result=a+a;
  console.log(result);
}
fn1(2,4);//结果为8

3.严格模式不允许八进制整数直接量(如下)。非严格模式下不会报错。

"use strict"
var x=089;
console.log(x);//报错:Decimals with leading zeros are not allowed in strict mode.

4.严格模式中,arguments对象是传入函数内实参列表的静态副本(即不再追踪参数的变化);非严格模式下,arguments对象里的元素和对应的实参是指向同一个值的引用。

严格模式下

fn(5);
function fn(a){
  "use strict";
  a = 42;
  // return a==arguments[0];//返回false
  console.log(a);//结果为42
  console.log(arguments[0]);//结果为5,严格模式下arguments[0]表示这个调用方法的第一个参数     (不再追踪  参数的变化,在函数内部,参数a被重新赋值为42,但arguments[0]仍然为5.)
}

非严格模式下

fn(5);
function fn(a){
  a = 42;
  // return a==arguments[0];//返回true
  console.log(a);//结果为42
  console.log(arguments[0]);//结果为42(追踪参数变化)

}

5.严格模式中 eval和arguments当做关键字,它们不能被赋值和用作变量声明

"use strict";
var eval=3;//报错:Unexpected eval or arguments in strict mode
var argument=6;//同样报错

6.严格模式会限制对调用栈的检测能力,访问arguments.callee,arguments.callee.caller会抛出异常

严格模式下:

"use strict";
function fn(n){
  if(n==0){
    return 1;
  }else{
    return n*arguments.callee(n-1);
  }
}
console.log(fn(5));//报错

非严格模式下:

function fn(n){//阶乘
  if(n==0){
    return 1;
  }else{
    return n*arguments.callee(n-1);
  }
}
console.log(fn(5));//正常120

caller:在一个函数调用另一个函数时,被调用函数会自动生成一个caller属性,指向调用它的函数对象。如果该函数当前未被调用,或并非被其他函数调用,

则caller为null。如下:

严格模式下:

"use strict"
function fn1() {
  var n1= fn1.caller;
  console.log(n1);
}
function fn2() {
  fn1();
}
fn2();//报错

非严格模式下:

function fn1() {
  var n1= fn1.caller;//此例中caller指向调用它的函数(fn2)
  console.log(n1);
}
function fn2() {
  fn1();
}
fn2();// 结果打印出:function fn2(){ fn1( ) };

7.严格模式变量必须先声明,直接给变量赋值,不会隐式创建全局变量,不能用with。

严格模式下

"use strict";
with(obj){
  x;
}//报错:Strict mode code may not include a with statement

解释:道运行脚本时,首先是编译,然后再执行。显然在编译的时候,所以就不能在编译时确定with语句块中的变量到底归属哪个对象。[with语句块中的变量是(cl)的属性

还是上一层变量作用域链中的变量。]。只能在执行时才能确定(c1)是Clothes的一个实例。这与严格模式有编译时就检查变量是否定义冲突,所以严格模式不会with语句的使用。

扩展:with语句的使用(用来引用某个特定对象中已有的属性,但是不能用来给对象添加属性。)

with(object instance)
{
  //代码块
}
eg:function Clothes(){
  this.color="red";
  this.size="m";
  this.price="cheap";
}
var c1=new Clothes();
with(c1){
  var str="颜色:"+color+",尺寸:"+size+",价格:"+price;
  document.write(str);
}//结果(颜色:red,尺寸:m,价格:cheap)

严格模式中 call apply传入null undefined保持原样不被转换为window

总结

以上所述是小编给大家介绍的Javascript 严格模式use strict详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言小编会及时回复大家的!

Javascript 相关文章推荐
Three.js源码阅读笔记(Object3D类)
Dec 27 Javascript
JQuery中dataGrid设置行的高度示例代码
Jan 03 Javascript
一个很有趣3D球状标签云兼容IE8
Aug 22 Javascript
jQuery表格列宽可拖拽改变且兼容firfox
Sep 03 Javascript
jQuery学习笔记之2个小技巧
Jan 19 Javascript
jQuery实现导航滚动到指定内容效果完整实例【附demo源码下载】
Sep 20 Javascript
JavaScript用构造函数如何获取变量的类型名
Dec 23 Javascript
Vue 单文件中的数据传递示例
Mar 21 Javascript
详谈innerHTML innerText的使用和区别
Aug 18 Javascript
Bootstrap模态对话框用法简单示例
Aug 31 Javascript
js 计数排序的实现示例(升级版)
Jan 12 Javascript
实例讲解JavaScript 计时事件
Jul 04 Javascript
ES6中Array.copyWithin()函数的用法实例详解
Sep 16 #Javascript
JS闭包的几种常见形式实例详解
Sep 16 #Javascript
ES6中Array.find()和findIndex()函数的用法详解
Sep 16 #Javascript
详解JS构造函数中this和return
Sep 16 #Javascript
Angular使用Md5加密的解决方法
Sep 16 #Javascript
使用JS实现气泡跟随鼠标移动的动画效果
Sep 16 #Javascript
EasyUI创建人员树的实例代码
Sep 15 #Javascript
You might like
apache中为php 设置虚拟目录
2014/12/17 PHP
PHP实现的策略模式简单示例
2017/08/25 PHP
PHP的JSON封装、转变及输出操作示例
2019/09/27 PHP
原生js实现给指定元素的后面追加内容
2013/04/10 Javascript
jquery插件lazyload.js延迟加载图片的使用方法
2014/02/19 Javascript
jquery实现全选、反选、获得所有选中的checkbox
2020/09/13 Javascript
js和jquery分别验证单选框、复选框、下拉框
2015/12/17 Javascript
如何利用JS通过身份证号获取当事人的生日、年龄、性别
2016/01/22 Javascript
实现一个Vue自定义指令懒加载的方法示例
2020/06/04 Javascript
netbeans7安装python插件的方法图解
2013/12/24 Python
Python中的defaultdict模块和namedtuple模块的简单入门指南
2015/04/01 Python
Python字典,函数,全局变量代码解析
2017/12/18 Python
Python2.7下安装Scrapy框架步骤教程
2017/12/22 Python
对Python 窗体(tkinter)文本编辑器(Text)详解
2018/10/11 Python
python函数声明和调用定义及原理详解
2019/12/02 Python
Python 面向对象部分知识点小结
2020/03/09 Python
django实现模型字段动态choice的操作
2020/04/01 Python
windows下的pycharm安装及其设置中文菜单
2020/04/23 Python
Python tempfile模块生成临时文件和临时目录
2020/09/30 Python
关于django python manage.py startapp 应用名出错异常原因解析
2020/12/15 Python
Django前后端分离csrf token获取方式
2020/12/25 Python
CSS3中颜色线性渐变实战
2015/07/18 HTML / CSS
CSS3选择器新增问题的实现
2021/01/21 HTML / CSS
最新的大学生找工作自我评价
2013/09/29 职场文书
大学校园活动策划书
2014/02/04 职场文书
《陈毅探母》教学反思
2014/05/01 职场文书
优秀少先队辅导员先进事迹材料
2014/05/18 职场文书
新闻报道策划方案
2014/06/11 职场文书
园林系毕业生求职信
2014/06/23 职场文书
求职自我推荐信
2014/06/25 职场文书
万能检讨书开头与结尾怎么写
2015/02/17 职场文书
2015年幼儿园中班下学期工作总结
2015/05/22 职场文书
缅怀先烈主题班会
2015/08/14 职场文书
如何使用JavaScript策略模式校验表单
2021/04/29 Javascript
Pytorch数据读取之Dataset和DataLoader知识总结
2021/05/23 Python
Win11 Build 22000.829更新补丁KB5015882发布(附更新修复内容汇总)
2022/07/15 数码科技