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 相关文章推荐
使用JQ来编写最基本的淡入淡出效果附演示动画
Oct 31 Javascript
jQuery插件简单学习实例教程
Jul 01 Javascript
微信小程序前端源码逻辑和工作流
Sep 25 Javascript
Ionic + Angular.js实现验证码倒计时功能的方法
Jun 12 Javascript
Vue项目中quill-editor带样式编辑器的使用方法
Aug 08 Javascript
深入理解Vue2.x的虚拟DOM diff原理
Sep 27 Javascript
JavaScript for循环 if判断语句(学习笔记)
Oct 11 Javascript
JS实现的简单下拉框联动功能示例
May 11 Javascript
浅谈VueJS SSR 后端绘制内存泄漏的相关解决经验
Dec 20 Javascript
原生JS检测CSS3动画是否结束的方法详解
Jan 27 Javascript
简单易扩展可控性强的Jquery转盘抽奖程序
Mar 16 jQuery
解决vue语法会有延迟加载显现{{xxx}}的问题
Nov 14 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
在PHP中利用XML技术构造远程服务(下)
2006/10/09 PHP
php设计模式  Command(命令模式)
2011/06/17 PHP
php中通过curl smtp发送邮件
2012/06/05 PHP
PHP微信刮刮卡 附微信接口
2016/07/22 PHP
PHP类型约束用法示例
2016/09/28 PHP
Laravel框架实现定时Task Scheduling例子
2019/10/22 PHP
用JS提交参数创建form表单在FireFox中遇到的问题
2013/01/16 Javascript
javascript简单实现图片预加载
2014/12/03 Javascript
原生javascript实现自动更新的时间日期
2016/02/12 Javascript
Node.js connect ECONNREFUSED错误解决办法
2016/09/15 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
canvas实现图像布局填充功能
2017/02/06 Javascript
vue构建单页面应用实战
2017/04/10 Javascript
protractor的安装与基本使用教程
2017/07/07 Javascript
vue学习之mintui picker选择器实现省市二级联动示例
2017/10/12 Javascript
微信小程序实现发红包功能
2018/07/11 Javascript
vue.js中toast用法及使用toast弹框的实例代码
2018/08/27 Javascript
解决微信小程序调用moveToLocation失效问题【超简单】
2019/04/12 Javascript
详解vue项目中实现图片裁剪功能
2019/06/07 Javascript
JavaScript中var的重要性实例分析
2019/07/09 Javascript
js神秘的电报密码 哈弗曼编码实现
2019/09/10 Javascript
利用 JavaScript 实现并发控制的示例代码
2020/12/31 Javascript
Python 文件操作技巧(File operation) 实例代码分析
2008/08/11 Python
python导入时小括号大作用
2017/01/10 Python
Python实现Linux的find命令实例分享
2017/06/04 Python
Python实现最常见加密方式详解
2019/07/13 Python
简单了解Python多态与属性运行原理
2020/06/15 Python
Python 如何展开嵌套的序列
2020/08/01 Python
python闭包与引用以及需要注意的陷阱
2020/09/18 Python
介绍一下代理模式(Proxy)
2014/10/17 面试题
英文版销售经理个人求职信
2013/11/20 职场文书
检查接待方案
2014/02/27 职场文书
大学新生军训自我鉴定
2014/03/18 职场文书
交通事故和解协议书
2014/09/25 职场文书
2015年入党决心书
2015/02/05 职场文书
如何更改Win11声音输出设备?Win11声音输出设备四种更改方法
2022/04/08 数码科技