第七节:with、eval、严格模式剖析
一. with详解
with语句 扩展一个语句的作用域链
注:不建议使用with语句,因为它可能是混淆错误和兼容性问题的根源。
代码分享:
{ let name = "ypf1"; let age = 18; let obj = { name: "ypf2", age: 19, }; //下面中的name和age会从obj中查找 with (obj) { console.log(name, age); //ypf2,19 } }
二. eval详解
用途:eval是一个特殊的函数,它可以将传入的字符串当做JavaScript代码来运行。
特别注意:不建议在开发中使用eval
eval代码的可读性非常的差(代码的可读性是高质量代码的重要原则);
eval是一个字符串,那么有可能在执行的过程中被刻意篡改,那么可能会造成被攻击的风险;
eval的执行必须经过JS解释器,不能被JS引擎优化;
代码分享:
{ var jsString = 'var message = "Hello World"; console.log(message);'; var message = "Hello World"; console.log(message); eval(jsString); }
三. 严格模式详解
1. 什么是严格模式?
在ES6中,JavaScript提出严格模式,
严格模式很好理解,是一种具有限制性的JavaScript模式,从而使代码隐式的脱离了 ”懒散(sloppy)模式“;
支持严格模式的浏览器在检测到代码中有严格模式时,会以更加严格的方式对代码进行检测和执行;
2. 开启严格模式的两种方式:
(1). 全局开启
(2). 函数中开启
代码分享:
{ // 1. 整个文件开启严格模式 // "use strict" // 2. 函数中开启 function foo() { "use strict"; true.foo = "abc"; } foo(); }
3. 严格模式的限制
(1). 无法意外的创建全局变量
(2). 严格模式会使引起静默失败(silently fail,注:不报错也没有任何效果)的赋值操作抛出异常
(3). 严格模式下试图删除不可删除的属性
(4).严格模式不允许函数参数有相同的名称
(5). 不允许0的八进制语法
(6). 在严格模式下,不允许使用with
(7). 在严格模式下,eval不再为上层引用变量
(8). 严格模式下,this绑定不会默认转成对象
代码分享:
"use strict"; { // 1. 禁止意外创建全局变量 { message = "Hello World"; console.log(message); function foo() { age = 20; } } // 2.不允许函数有相同的参数名称 { function foo(x, y, x) { console.log(x, y, x); } foo(10, 20, 30); } // 3.静默错误 { true.name = "abc"; NaN = 123; var obj = {}; Object.defineProperty(obj, "name", { configurable: false, writable: false, value: "why", }); console.log(obj.name); // obj.name = "kobe" } // 4.不允许使用原先的八进制格式 0123 var num = 0o123; // 八进制 var num2 = 0x123; // 十六进制 var num3 = 0b100; // 二进制 console.log(num, num2, num3); // 5.with语句不允许使用 // 6.eval函数不会向上引用变量了 { var jsString = '"use strict"; var message = "Hello World"; console.log(message);'; eval(jsString); console.log(message); } //7. 严格模式,默认绑定中的this指向undefined,隐式绑定依旧执行obj { function foo() { console.log(this); } var obj = { name: "why", foo: foo, }; foo(); //undefined obj.foo(); // 隐式绑定指向依旧obj } }
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。