with

with语句可以形成自己的作用域,但目前已经不推荐使用,甚至在严格模式下不允许使用with语句

  1. var meg="window"
  2. var obj={meg:'rv'};
  3. with(obj){
  4. console.log(msg); // "rv"
  5. }

with语句弊端

  • 可能产生混淆错误
  • 兼容性问题

eval

eval全局函数可以将传入的字符串当做JavaScript代码执行

webpack中可能会利用eval生成一些临时字符串代码,对执行效率有所提高。但打包后不会在存在这些代码

  1. var jsString=`
  2. var msg="Hello World";
  3. console.log(msg);
  4. `;
  5. eval(jsString);

eval函数弊端

  • eval代码可读性差(代码的可读性是高质量代码的重要原则)
  • eval是一个字符串,有可能在执行过程中被刻意篡改,那么可能造成被攻击风险
  • eval的执行必须经过JS解释器,不能被JS引擎优化

严格模式

ECMAScript5标准中,JavaScript提出了严格模式(Strict Mode)概念

严格模式是一种具有限制性的JavaScript模式,从而使代码隐式的脱离了“懒散(sloppy)模式”

严格模式开启方式

  1. /* 1.JS文件首行开启严格模式 */
  2. "use strict";
  3. /* 2.函数体首行开启严格模式 */
  4. function foo(){
  5. "use strict";
  6. }
  7. /* 3.eval函数首行开启严格模式 */
  8. var jsString='use strict;···'
  9. eval(jsString);

严格模式的影响

  • 严格模式通过抛出错误来消除一些原有的静默(silent)错误 ```javascript / 静默错误案例 / message=”abc”

123.name=”abc”

Object.definePrototype(obj,”name”,{writable:false}) obj.name=”why”

  1. -
  2. 严格模式让JS引擎在执行代码时可以进行更多的优化,不需要对一些特殊的语法进行处理
  3. -
  4. 严格模式禁用了在ECMAScript未来版本中可能会定义的一些语法
  5. <a name="ddd000ca"></a>
  6. ## 常见严格模式的限制
  7. 1.
  8. 禁止意外创建全局变量
  9. ```javascript
  10. message="Hello World"
  11. function foo(){
  12. age=20
  13. }
  1. 不允许函数有相同的参数名称
    1. function foo(x,y,x){
    2. console.log(x,y,x)
    3. }
    4. foo(10,20,30) // 30,20,30
  1. 不允许使用原先的八进制格式
    1. /* 原先以'0'开头为八进制 */
    2. var num=0123;
    3. /*
    4. ES6推出
    5. 二进制:'0b'
    6. 八进制:'0o'
    7. 十六进制:'0x'
    8. */
  1. with语句不允许使用

  2. eval函数不会向上引用变量 ```javascript var jsString=’var msg=”Hello”‘; eval(jsString)

console.log(msg) ```

  1. 严格模式下this,默认绑定指向undefined