with
with语句可以形成自己的作用域,但目前已经不推荐使用,甚至在严格模式下不允许使用with语句
var meg="window"var obj={meg:'rv'};with(obj){console.log(msg); // "rv"}
with语句弊端
- 可能产生混淆错误
- 兼容性问题
eval
eval全局函数可以将传入的字符串当做JavaScript代码执行
webpack中可能会利用eval生成一些临时字符串代码,对执行效率有所提高。但打包后不会在存在这些代码
var jsString=`var msg="Hello World";console.log(msg);`;eval(jsString);
eval函数弊端
- eval代码可读性差(代码的可读性是高质量代码的重要原则)
- eval是一个字符串,有可能在执行过程中被刻意篡改,那么可能造成被攻击风险
- eval的执行必须经过JS解释器,不能被JS引擎优化
严格模式
ECMAScript5标准中,JavaScript提出了严格模式(Strict Mode)概念
严格模式是一种具有限制性的JavaScript模式,从而使代码隐式的脱离了“懒散(sloppy)模式”
严格模式开启方式
/* 1.JS文件首行开启严格模式 */"use strict";/* 2.函数体首行开启严格模式 */function foo(){"use strict";}/* 3.eval函数首行开启严格模式 */var jsString='use strict;···'eval(jsString);
严格模式的影响
- 严格模式通过抛出错误来消除一些原有的
静默(silent)错误```javascript / 静默错误案例 / message=”abc”
123.name=”abc”
Object.definePrototype(obj,”name”,{writable:false}) obj.name=”why”
-严格模式让JS引擎在执行代码时可以进行更多的优化,不需要对一些特殊的语法进行处理-严格模式禁用了在ECMAScript未来版本中可能会定义的一些语法<a name="ddd000ca"></a>## 常见严格模式的限制1.禁止意外创建全局变量```javascriptmessage="Hello World"function foo(){age=20}
- 不允许函数有相同的参数名称
function foo(x,y,x){console.log(x,y,x)}foo(10,20,30) // 30,20,30
- 不允许使用原先的八进制格式
/* 原先以'0'开头为八进制 */var num=0123;/*ES6推出二进制:'0b'八进制:'0o'十六进制:'0x'*/
with语句不允许使用
eval函数不会向上引用变量 ```javascript var jsString=’var msg=”Hello”‘; eval(jsString)
console.log(msg) ```
- 严格模式下this,默认绑定指向undefined
