【慕课学习】《JavaScript深入浅出》——严格模式
2016-07-28 01:11
375 查看
js的严格模式是一种特殊的执行模式,它修复了部分语言上的不足,提供更强的错误检查,并增强安全性。
进入严格模式:
严格模式和普通模式的区别在于:
1、严格模式不允许使用with语句
2、不允许未声明的变量被赋值
3、arguments参数的静态副本
4、delete参数、函数名报错
5、delete不可配置的属性报错
6、对象字面量重复属性报错
7、禁止八进制字面量
8、eval、arguments变为关键字,不能作为变量、函数名
9、eval变成独立作用域
10、其他
进入严格模式:
//在函数开头加上‘use strict’指令 function func(){ 'use strict'; //code } //或在整个js文件最开头加上‘use strict’指令,使整个js都使用严格模式 'use strict'; function func(){ //code } //注:如果浏览器不支持严格模式,‘use strict’指令会被当作普通字符串而被忽略 //实际上'use strict'之前也可以添加其他指令,但必须写在正式的js代码之前
严格模式和普通模式的区别在于:
1、严格模式不允许使用with语句
!function(){ with({x:1}){ console.log(x); } }() //1 !function(){ 'use strict'; with({x:1}){ console.log(x); } }() //SyntaxError
2、不允许未声明的变量被赋值
!function(){ x=1; console.log(window.x); }() //1 !function(){ 'use strict'; x=1; console.log(window.x); }() //ReferenceError
3、arguments参数的静态副本
!function(a){ arguments[0]=100; console.log(a); }(1) //100 //注:若传的参数不是1,而是不传,那么结果为undefined,不会受arguments影响 !function(a){ 'use strict'; arguments[0]=100; console.log(a); }(1) //1 //注:arguments变为静态副本,与形参a没有绑定关系,不会与a相互影响 !function(a){ 'use strict'; arguments[0].x=100; console.log(a.x); }({x:1}) //100 //注:若参数为对象,修改对象的属性,arguments与形参a还是会相互影响
4、delete参数、函数名报错
!function(a){ console.log(delete a); }(1) //false !function(a){ 'use strict'; console.log(delete a); }(1) //SyntaxError
5、delete不可配置的属性报错
!function(a){ var obj={}; Object.defineProperty(obj,'a',{configurable:false}); console.log(delete obj.a); }(1) //false !function(a){ 'use strict'; var obj={}; Object.defineProperty(obj,'a',{configurable:false}); console.log(delete obj.a); }(1) //TypeError
6、对象字面量重复属性报错
!function(){ var obj={x:1,x:2}; console.log(obj.x); }() //2 !function(){ 'use strict'; var obj={x:1,x:2}; console.log(obj.x); }() //SyntaxError
7、禁止八进制字面量
!function(){ console.log(0123); }() !function(){ 'use strict'; console.log(0123); }() //SyntaxError
8、eval、arguments变为关键字,不能作为变量、函数名
!function(){ function eval(){}; console.log(eval); }() //function eval(){} !function(){ 'use strict'; function eval(){}; }() //SyntaxError
9、eval变成独立作用域
!function(){ eval('var val=3;'); console.log(typeof val); }() //number !function(){ 'use strict'; eval('var val=3;'); console.log(typeof val); }() //undefined,在eval外不能拿到eval内声明的变量
10、其他
严格模式下,一般函数调用时(不是对象的方法调用,也不适用apply/call/bind等修改this)this指向null,而不是全局对象。 若使用apply/call,当传入null或undefined时,this将指向null或undefined,而不是全局对象。 arguments.cller,arguments.callee被禁用。
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 最后一次说说闭包
- Ajax
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 设计模式---状态模式在web前端中的应用
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- Redux系列02:一个炒鸡简单的react+redux例子