利用eval()来“欺骗”JavaScript词法作用域

我们知道,所谓“词法作用域”就是按照代码书写时的样子内部函数可以访问函数外部的变量,如果函数外存在函数内所具有的同名变量,则函数内部要获取该同名变量的值会屏蔽掉函数外的同名变量(本来就是两个不同的变量,只是同名而已。另外注意,在同一个作用域是同一个变量,所以不要重复声明,否则第二个声明会被忽略)。

利用eval()可以“欺骗”词法作用域:

function foo(str){
    eval(str);
    console.log(a);
}

var a=100;

foo("var a=12");   // 12

按道理应该输出100,可实际上输出是12,因为eval可以造成var a=12;这条语句就好像在eval()所在的位置一样。这段代码实际上在foo函数里创建了变量b,所以自然屏蔽了函数外的变量b。

eval()可以动态插入代码,但实际上对性能有影响,所以最好不要使用它。

原文地址:https://www.cnblogs.com/linweinb/p/8280223.html

时间: 2024-08-29 22:15:32

利用eval()来“欺骗”JavaScript词法作用域的相关文章

JavaScript词法作用域(你不知道的JavaScript)

JavaScript并不是传统的块级作用域,而是函数作用域! 一.作用域 1. JavaScript引擎在代码执行前会对其进行编译,在这个过程中,像var a = 2 这样的声明会被分解成两个独立的步骤: 第一步(编译阶段):var a 在其作用域中声明新变量.这会在最开始的阶段,也就是代码执行前进行. 第二步(运行阶段):a = 2 会查询变量a(LHS查询)并对其进行赋值. 2. LHS & RHS(当前作用域->上级作用域->...->全局作用域) LHS(左侧):试图找到

JavaScript词法作用域与调用对象

关于 Javascript 的函数作用域.调用对象和闭包之间的关系很微妙,关于它们的文章已经有很多,但不知道为什么很多新手都难以理解.我就尝试用比较通俗的语言来表达我自己的理解吧. 作用域 Scope Javascript 中的函数属于词法作用域,也就是说函数在它被定义时的作用域中运行而不是在被执行时的作用域内运行.这是犀牛书上的说法.但"定义时"和"执行(被调用)时"这两个东西有些人搞不清楚.简单来说,一个函数A在"定义时"就是 functio

JavaScript词法作用域经典练习题

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <script> //1 ==================================================== var a; if ('a

js 欺骗词法作用域

如果词法作用域完全由写代码期间函数所声明的位置来定义,怎样才能在运行时来"修改"(也可以说欺骗)词法作用域呢?    JavaScript 中有两种机制来实现这个目的.社区普遍认为在代码中使用这两种机制并不是什么好注意.但是关于它们的争论通常会忽略掉最重要的点:欺骗词法作用域会导致性能下降.在详细解释性能问题之前,先来看看这两种机制分别是什么原理 1.eval JavaScript 中的 eval(..) 函数可以接受一个字符串为参数,并将其中的内容视为好像在书写时就存在于程序中这个位

你不知道的Javascript(上卷)读书笔记之二 ---- 词法作用域

在前一篇文章中,我们把作用域定义为"管理.维护变量的一套规则",接下来是时候来深入讨论一下Js的作用域问题了,首先我们要知道作用域一般有两种主要的工作类型,一种是词法作用域,一种是动态作用域, Javascript采用的是词法作用域, 关于动态作用域的有兴趣的可以自行Google. 1.词法阶段 首先我们要理解"词法阶段"这个词语,我们已经了解到Js存在一个编译阶段,编译阶段的第一步就是分词/词法分析,我们可以简称为"词法阶段" 简单来说,词法作

你不知道的JS系列 ( 7 ) - 欺骗词法作用域

如果词法作用域完全由写代码期间函数所声明的位置来定义,怎样才能在运行时来“修改”词法作用域呢?有些人喜欢特殊的办法来解决遇到的问题.我们规定词法作用域是代码写在哪里决定的,一旦决定了无法更改,因为一些问题,我们不得不更改作用域,尽管这是不被推荐的,那是什么办法,JavaScript 中有两种机制来实现这个目的 eval function foo(str, a) { eval(str); console.log(a, b) } var b = 2; foo("var b = 3", 1)

javascript从作用域到闭包-笔记

读<你不知道的javascript>一书做个笔记;编译原理:    js是一门编译型的语言,与传统编译语言类似,传统编译的过程分为三个阶段 ;     1. 分词/词法分析; 2.解析/语法分析; 3.代码生成 ;     js引擎在编译时会比较复杂 具体多么复杂我也不造,大概就是对1,3 进行了优化使其快速编译完成并立即执行,这里就要注意了,,js是在执行前编译的 也许几微秒就OK了1.作用域 :  // 收集并维护所有声明的变量组成一个查询机制,用一套严格的规则以确保当前执行的代码对这些变

javascript一个作用域案例分析

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script type="text/javascript"> // 词法作用域: // 在js中只有函数能够形成一个作用域, 所以, 词

JavaScript的词法作用域问题

多年以前,当我怀揣着前端工程师的梦想时,曾经认真阅读过<JavaScript高级程序设计(第2版)>.里面有一个问题(P147),让我一直百思不得其解. 1 function createFunctions(){ 2 var result = new Array(); 3 4 for(var i = 0; i < 10; i++){ 5 result[i] = function() { 6 return i; 7 } 8 } 9 return result; 10 } 11 12 var