with语句-eval函数-strict严格模式内容补充

with语句-eval函数-strict严格模式内容补充

1.with语句

with语句 扩展一个语句的作用域链。

// with语句: 可以形成自己的作用域
// function foo(){
//   var message='hello'
//   console.log(message)
// }
// foo()
const obj={
  name:'liu',
  message:'world'
}

function foo(){
  // var message='hello'
  with(obj){
    console.log(message)
  }
}
foo()

with(obj){
  console.log(name)
}

不建议使用with语句,因为它可能是混淆错误和兼容性问题的根源。

2.eval函数

eval是一个**特殊的函数,**它可以将传入的字符串当做JavaScript代码来运行。

const jsString='const message="hello"; console.log(message)'
eval(jsString)

不建议在开发中使用eval

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

3.认识严格模式

​ 在ECMAScript5标准中,JavaScript提出了严格模式的概念(Strict Mode): 严格模式很好理解,是一种具有限制性的JavaScript模式,从而使代码隐式的脱离了 ”懒散(sloppy)模式“; 支持严格模式的浏览器在检测到代码中有严格模式时,会以更加严格的方式对代码进行检测和执行; 严格模式对正常的JavaScript语义进行了一些限制:

  • 严格模式通过 抛出错误 来消除一些原有的 静默(silent)错误
  • 严格模式让JS引擎在执行代码时可以进行更多的优化(不需要对一些特殊的语法进行处理);
  • 严格模式禁用了在ECMAScript未来版本中可能会定义的一些语法
开启严格模式

​ 那么如何开启严格模式呢?严格模式支持粒度话的迁移:可以支持在js文件中开启严格模式;也支持对某一个函数开启严格模式;严格模式通过在文件或者函数开头使用 use strict 来开启。对其他的js文件没有影响,在webpack/rollup打包的js文件中默认会为我们添加严格模式。

在这里插入图片描述

严格模式限制

这里我们来说几个严格模式下的严格语法限制:

JavaScript被设计为新手开发者更容易上手,所以有时候本来错误语法,被认为也是可以正常被解析的;

但是这种方式可能给带来留下来安全隐患;

在严格模式下,这种失误就会被当做错误,以便可以快速的发现和修正;

1. 无法意外的创建全局变量

2. 严格模式会使引起静默失败(silently fail,注:不报错也没有任何效果)的赋值操作抛出异常

3. 严格模式下试图删除不可删除的属性

4.严格模式不允许函数参数有相同的名称

5. 不允许0的八进制语法

6. 在严格模式下,不允许使用with

7. 在严格模式下,eval不再为上层引用变量

8. 严格模式下,this绑定不会默认转成对象

**9.严格模式下,setTimeout中的this还是指向window,这跟浏览器有关,有想研究的可以看一下浏览器源码,文件很大。**而且对于我们来说,setTimeout是怎么执行的我们也不知道,这种我们称为黑盒子,但是其实我的猜想是通过apply调用触发的函数的自执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值