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 相关文章推荐
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
Sep 18 Javascript
Javascript中的几种URL编码方法比较
Jan 23 Javascript
js实现刷新iframe的方法汇总
Apr 27 Javascript
jQuery简单自定义图片轮播插件及用法示例
Nov 21 Javascript
angular学习之ngRoute路由机制
Apr 12 Javascript
JS+HTML5实现图片在线预览功能
Jul 22 Javascript
基于对象合并功能的实现示例
Oct 10 Javascript
解决使用Vue.js显示数据的时,页面闪现原始代码的问题
Feb 11 Javascript
微信小程序开发之改变data中数组或对象的某一属性值
Jul 05 Javascript
简述Vue中容易被忽视的知识点
Dec 09 Javascript
JS页面动态绘图工具SVG,Canvas,VML介简介
Oct 16 Javascript
Js利用正则表达式去除字符串的中括号
Nov 23 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
Zerg剧情介绍
2020/03/14 星际争霸
ajax在joomla中的原生态应用代码
2012/07/19 PHP
php中用加号与用array_merge合并数组的区别深入分析
2013/06/03 PHP
几个优化WordPress中JavaScript加载体验的插件介绍
2015/12/17 PHP
PHP读取大文件的多种方法介绍
2016/04/04 PHP
YII框架http缓存操作示例
2019/04/29 PHP
javascript学习笔记(四) Number 数字类型
2012/06/19 Javascript
Javascript中的arguments与重载介绍
2015/03/15 Javascript
在其他地方你学不到的jQuery小贴士和技巧(欢迎收藏)
2016/01/20 Javascript
jQuery Easyui datagrid/treegrid 清空数据
2016/07/09 Javascript
最原始的jQuery注册验证方式
2016/10/11 Javascript
Bootstrap基本布局实现方法详解
2016/11/25 Javascript
vue2.0父子组件及非父子组件之间的通信方法
2017/01/21 Javascript
原生js实现简单的链式操作
2017/07/04 Javascript
原生JS实现的雪花飘落动画效果
2018/05/03 Javascript
AngularJS实现的base64编码与解码功能示例
2018/05/17 Javascript
layui富文本编辑器前端无法取值的解决方法
2019/09/18 Javascript
JavaScript前后端JSON使用方法教程
2020/11/23 Javascript
vue3 watch和watchEffect的使用以及有哪些区别
2021/01/26 Vue.js
[01:31]DOTA2上海特级锦标赛 SECRET战队完整宣传片
2016/03/16 DOTA
PYQT5实现控制台显示功能的方法
2019/06/25 Python
Python实现图片批量加入水印代码实例
2019/11/30 Python
Python设计密码强度校验程序
2020/07/30 Python
scrapy头部修改的方法详解
2020/12/06 Python
C语言编程题
2015/03/09 面试题
酒店员工检讨书
2014/02/18 职场文书
伊索寓言教学反思
2014/05/01 职场文书
好的旅游活动方案
2014/08/19 职场文书
领导班子党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
党的群众路线教育实践活动领导班子整改措施
2014/09/30 职场文书
病人慰问信范文
2015/02/15 职场文书
大学生自我评价范文
2015/03/03 职场文书
初中同学会致辞
2015/08/01 职场文书
初中生物教学随笔
2015/08/15 职场文书
python编写函数注意事项总结
2021/03/29 Python
python编程实现清理微信重复缓存文件
2021/11/01 Python