JS查漏补缺——with语句、eval函数

简介: JS查漏补缺系列是我在学习JS高级语法时做的笔记,通过实践费曼学习法进一步加深自己对其的理解,也希望别人能通过我的笔记能学习到相关的知识点。这一次我们来了解with语句、eval函数

with语句

with 语句: 可以形成自己的作用域
原先:

var obj = {name:'巴咔巴咔',age:1,message:'hello world'}
var message = 'bye world'
function foo(){
    function bar(){
    console.log(message)
  }
  bar()
}
foo()
// 输出: bye world 
// 沿着作用域链一层一层往上查找,直到找到

with语句后:

var obj = {name:'巴咔巴咔',age:1,message:'hello world'}
var message = 'bye world'
function foo(){
    function bar(){
    with(obj){
      console.log(message)
    }
  }
  bar()
}
foo()
// 输出: hello world
// 先在with括号内指定的对象进行查找,找不到就再往上层作用域找
注意1: 单独一个对象不会形成一个作用域

注意2:在严格模式下with语句

image.png

所以with语句在严格模式下是行不通的。
在MDN的开头就写了:不建议使用with语句,因为它可能是混淆错误和兼容性问题的根源。
所以主要是了解一下有with语句这么一个东西就行,在现实开发中不推荐使用

eval函数

eval() 函数会将传入的字符串当做 JavaScript 代码进行执行。

var jsString = 'var message = "Hello World"; console.log(message);'

eval(jsString)  // Hello World

有时候在webpack生成的临时代码会看到,但在打包生成的文件中是不会有eval函数代码的

在MDN上也有写到:永远不要使用eval!
原因有这么几个:

  • eval代码的可读性非常的差(代码的可读性是高质量代码的重要原则); (可读性差)
  • eval是一个字符串,那么有可能在执行的过程中被刻意篡改,那么可能会造成被攻击的风险; (安全性低)
  • eval的执行必须经过JS解释器,不能被JS引擎优化 (效率低)
目录
相关文章
|
移动开发 JavaScript 前端开发
原生JavaScript+CSS实现计算器(简单的介绍一下eval函数)
原生JavaScript+CSS实现计算器(简单的介绍一下eval函数)
276 0
|
JSON JavaScript 小程序
js中eval()的使用说明
js中eval()的使用说明
424 0
|
JSON JavaScript Go
js中eval
js中eval
233 0
|
自然语言处理 JavaScript 前端开发
JavaScript中eval和with语句如何影响作用域链:探索深度知识
JavaScript中eval和with语句如何影响作用域链:探索深度知识
251 0
|
JavaScript
JS eval() 动态执行函数
JS eval() 动态执行函数
273 0
|
JavaScript 前端开发
JavaScript的break和continue语句的使用和区别
JavaScript的break和continue语句的使用和区别 JavaScript中break 和 continue都是用来控制循环结构,即用在for循环和while循环中。区别在于: break 语句用于跳出循环。 continue 用于跳过循环中的一个迭代。 1.break语句 break语句会终止循环并且跳出循环 for(var j=0;j<5;j++){ if(j==3){ break; } console.log(j);//0 1 2 }
|
JavaScript 前端开发
JavaScript的流程控制之if条件语句和switch选择语句(一)
JavaScript的流程控制(一) 接下来我么来讲一下JavaScript的流程控制,JavaScript中的流程控制主要包括条件语句和循环语句。这篇博客主要讲条件语句。说到条件语句主要包括if条件语句和switch选择语句两种。 1.if语句 //语法: // if(判断的条件){ // 条件成立时的执行代码 // } //if语句当条件不成立时,不执行任何的代码 var oDate=new Date(); console.log(oDate.getDay()); if(oDate.getDay()==6){
|
JavaScript 前端开发 Shell
开发中切忌使用的JavaScript语句 —— with语句 和 eval语句
开发中切忌使用的JavaScript语句 —— with语句 和 eval语句
311 0
|
JavaScript 前端开发 容器
前端(JavaScript)------运算符及分支语句、循环语句
先判断一个表达式的布尔值,然后根据布尔值的真伪,执行不同的语句。
210 0