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 相关文章推荐
js 鼠标点击事件及其它捕获
Jun 04 Javascript
js 兼容多浏览器的回车和鼠标焦点事件代码(IE6/7/8,firefox,chrome)
Apr 14 Javascript
avascript中的自执行匿名函数应用示例
Sep 15 Javascript
JavaScript数组前面插入元素的方法
Apr 06 Javascript
javascript中的作用域和闭包详解
Jan 13 Javascript
基于VUE.JS的移动端框架Mint UI的使用
Oct 11 Javascript
vue注册组件的几种方式总结
Mar 08 Javascript
javaScript强制保留两位小数的输入数校验和小数保留问题
May 09 Javascript
命令行批量截图Node脚本示例代码
Jan 25 Javascript
vue用BMap百度地图实现即时搜索功能
Sep 26 Javascript
javascript设计模式 ? 观察者模式原理与用法实例分析
Apr 22 Javascript
浅谈es6中的元编程
Dec 01 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增删改查示例自己写的demo
2013/09/04 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
2014/08/18 PHP
PHP保存带BOM文件的方法
2015/02/12 PHP
php实现的一段简单概率相关代码
2016/05/30 PHP
键盘 keycode的值 javascript时触发事件时很有用的要素
2009/11/02 Javascript
获取数组中最大最小值方法js代码(自写)
2013/08/12 Javascript
js设置cookie过期及清除浏览器对应名称的cookie
2013/10/24 Javascript
iframe子父页面调用js函数示例
2013/11/07 Javascript
nodejs npm install全局安装和本地安装的区别
2014/06/05 NodeJs
jQuery实现复选框全选/取消全选/反选及获得选择的值
2014/06/12 Javascript
Node.js入门教程:在windows和Linux上安装配置Node.js图文教程
2014/08/14 Javascript
JavaScript Length 属性的总结
2015/11/02 Javascript
jQuery 实现ajax传入参数含有特殊字符的方法总结
2016/10/17 Javascript
js调用屏幕宽度的简单方法
2016/11/14 Javascript
JS与SQL方式随机生成高强度密码示例
2018/12/29 Javascript
Angular CLI 使用教程指南参考小结
2019/04/10 Javascript
原生JS实现留言板功能
2020/02/08 Javascript
javascript利用键盘控制小方块的移动
2020/04/20 Javascript
python批量提交沙箱问题实例
2014/10/08 Python
简述Python2与Python3的不同点
2018/01/21 Python
分分钟入门python语言
2018/03/20 Python
深入浅析Python的类
2018/06/22 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
jupyter notebook 重装教程
2020/04/16 Python
浅谈python多线程和多线程变量共享问题介绍
2020/04/17 Python
Python爬虫爬取博客实现可视化过程解析
2020/06/29 Python
HTML5+lufylegend实现游戏中的卷轴
2016/02/29 HTML / CSS
Lulu & Georgia官方网站:购买地毯、家具、抱枕、壁纸、床上用品等
2018/03/19 全球购物
中国跨境在线时尚零售商:Bellelily
2018/04/06 全球购物
文明之星事迹材料
2014/05/09 职场文书
关于环保的宣传稿
2015/07/23 职场文书
小学校园广播稿
2015/08/18 职场文书
TV动画「神渣☆爱豆」公开第一弹主视觉图
2022/03/21 日漫
python Tkinter模块使用方法详解
2022/04/07 Python
mysql 乱码 字符集latin1转UTF8
2022/04/19 MySQL