时间:2021-05-26
严格模式:由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);//结果为83.严格模式不允许八进制整数直接量(如下)。非严格模式下不会报错。
"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 modevar 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));//正常120caller:在一个函数调用另一个函数时,被调用函数会自动生成一个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详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言小编会及时回复大家的!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
一、概述除了正常运行模式,ECMAscript5添加了第二种运行模式:“严格模式”(strictmode)。顾名思义,这种模式使得Javascript在更严格的
javascript严格模式第一次接触let关键字,有一个要非常非常要注意的概念就是”javascript严格模式”,比如下述的代码运行就会报错:lethell
一、什么是严格模式我们平时写的JavaScript代码一般都运行在正常模式中的,除了正常运行模式,ECMAscript5添加了第二种运行模式:”严格模式”(st
1、使用strict模式在一个作用域(包括函数作用域、全局作用域)中,可以使用"usestrict";来开启strict模式。2、缩进用Tab键进行代码缩进,以
其实XHTML1.0还分两种(加上FramesetDOCTYPE的话算三种,本文不讨论),Transitional(过渡型)和Strict(严格)DOCTYPE