js学习笔记:严格模式
来源:互联网 发布:html5编程软件 编辑:程序博客网 时间:2024/06/01 08:19
概述
除了正常运行模式,ECMAscript 5添加了第二种运行模式:”严格模式”(strict mode)。顾名思义,这种模式使得Javascript在更严格的条件下运行。
设立”严格模式”的目的,主要有以下几个:
- 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
- 消除代码运行的一些不安全之处,保证代码运行的安全;
- 提高编译器效率,增加运行速度;
- 为未来新版本的Javascript做好铺垫。
进入”严格模式”的标志,是下面这行语句:
"use strict";
老版本的浏览器会把它当作一行普通字符串,加以忽略。
如何使用
针对整个脚本文件
将”use strict”放在脚本文件的第一行,则整个脚本都将以”严格模式”运行。如果这行语句不在第一行,则无效,整个脚本以”正常模式”运行。
<script> "use strict"; console.log("这是严格模式。"); </script> <script> console.log("这是正常模式。");kly, it's almost 2 years ago now. I can admit it now - I run it on my school's network that has about 50 computers. </script>
上面的代码表示,一个网页中依次有两段Javascript代码。前一个script标签是严格模式,后一个不是。
针对单个函数
将”use strict”放在函数体的第一行,则整个函数以”严格模式”运行。
function strict(){ "use strict"; return "这是严格模式。"; } function notStrict() { return "这是正常模式。"; }
与非严格模式的区别
全局变量声明
在非严格模式中,全局变量未经声明就赋值时不会报错的:
a = 2;
而在严格模式中,这种情况则会报错。
因此,严格模式下,变量都必须先用var命令声明,然后再使用。
禁止使用with语句
eval作用域
正常模式下,Javascript语言有两种变量作用域(scope):全局作用域和函数作用域。严格模式创设了第三种作用域:eval作用域。
正常模式下,eval语句的作用域,取决于它处于全局作用域,还是处于函数作用域。严格模式下,eval语句本身就是一个作用域,不再能够生成全局变量了,它所生成的变量只能用于eval内部。
"use strict"; var x = 2; console.info(eval("var x = 5; x")); // 5 console.info(x); // 2
this的指向
在函数的普通调用中,正常模式下this是会指向全局对象的,但是在严格模式下this则为undefined。
function f(){ return !this; } // 返回false,因为"this"指向全局对象,"!this"就是false function f(){ "use strict"; return !this; } // 返回true,因为严格模式下,this的值为undefined,所以"!this"为true。
因此,使用构造函数时,如果忘了加new,this不再指向全局对象,而是报错。
function f(){ "use strict"; this.a = 1; }; f();// 报错,this未定义
arguments、caller、callee
在严格模式下,访问arguments.callee, arguments.caller, anyFunction.caller以及anyFunction.arguments都会抛出异常
function f1(){ "use strict"; f1.caller; // 报错 f1.arguments; // 报错 } f1();
禁止删除变量
严格模式下无法删除变量。只有configurable设置为true的对象属性,才能被删除。
"use strict"; var x; delete x; // 语法错误 var o = Object.create(null, {'x': { value: 1, configurable: true }}); delete o.x; // 删除成功
为只读属性赋值
正常模式下,对一个对象的只读属性进行赋值,不会报错,只会默默地失败。严格模式下,将报错。
"use strict"; var o = {}; Object.defineProperty(o, "v", { value: 1, writable: false }); o.v = 2; // 报错
重名错误
- 对象不能有重名的属性
正常模式下,如果对象有多个重名属性,最后赋值的那个属性会覆盖前面的值。严格模式下,这属于语法错误。
"use strict"; var o = { p: 1, p: 2 }; // 语法错误
- 函数不能有重名的参数
正常模式下,如果函数有多个重名的参数,可以用arguments[i]读取。严格模式下,这属于语法错误。
"use strict"; function f(a, a, b) { // 语法错误 return ; }
禁止八进制表示法
正常模式下,整数的第一位如果是0,表示这是八进制数,比如0100等于十进制的64。严格模式禁止这种表示法,整数第一位为0,将报错。
"use strict"; var n = 0100; // 语法错误
- js学习笔记:严格模式
- js学习笔记(严格模式)
- Javascript学习笔记(严格模式)
- DOCTYPE 严格模式与JS严格模式
- js strict 严格模式
- js严格模式
- js严格模式
- js之严格模式
- js严格模式详解
- JS严格模式
- js严格模式实例
- js严格模式
- js严格模式
- js-- 严格模式
- js严格模式总结
- JS严格模式
- js严格模式
- js严格模式
- 安装Halcon10.0
- Java HashMap分析及其它
- React Native网络请求学习笔记(Android版本)
- C++ 实现反射机制
- 不同形状的头像
- js学习笔记:严格模式
- BZOJ 3672 [Noi2014]购票【点分+斜率优化
- 在Fragment中webView的回退问题
- 系统开发奥若拉模式
- 约瑟夫环
- REDIS 进阶(12) redis分片
- Caffe使用教程【转】
- 近五年来133个Java 面试问题及列表
- okhttp3 http 重定向到 https