/*
* =========================================================
*
* JavaScript 词法欺骗
*
* 1.欺骗词法作用域,会导致性能下降。
* 2.引擎在代码中发现了,eval()和 with()函数时,引擎在词法阶段并不知道它们将接收的什么代码,引擎只能简单的假设关于标示符是无效的。
* 3.在javascript中编译源代码时,其中一步是对代码做大量的优化,当遇到上述两个函数时,引擎只能不做任何代码的优化,这个是降低性能的原因。
* 4.eval()和 with()函数,都将在运行时起到作用。
*
* =========================================================
* */ // function foo(str, a) {
// eval(str); // 欺骗词法
// console.log(a, b); // 1 3
// }
//
// var b = 2;
//
// foo("var b = 3;", 1); //
// var obj = {
// a: 1,
// b: 2,
// c: 3
// };
//
// console.log(obj.a);
// console.log(obj.b);
// console.log(obj.c); // with 通常被当作重复引用同一个对象中的多个属性的快捷方式。
// 但不推荐使用,因会改变当前作用域,降低性能,并且可能造成变量泄漏。
// 不用循环的重复的调用对象本身。
// with (obj) {
// a = 3;
// b = 4;
// c = 5;
// }
//
// console.log(obj.a);
// console.log(obj.b);
// console.log(obj.c); // with
// 首先我们知道a = 2; 是一个赋值操作(LHS)。当foo传入一个引用(obj),with会改变该
// 引用作用域中的a属性值,当在该引用查找不到a变量时,作用域查找方式起到作用,向上层作用域执行查找a变量
// 在该引用作用域、foo作用域、全局作用域中,都没有找到a变量时,with 就自动创建了一个全局变量(如果在上述作用域中查找到a变量将会改变其变量值),
// 这也叫做变量泄漏,造成这个原因是a=2 执行的时赋值操作,根据javascript中的特性,赋值操作前没有见变量声明标示符时,javascript就自动创建一个全局变量。
// 前提是非严格模式下,才会产生以上内容,严格模式下,将完全禁止使用with函数。
// with 实际上是根据你传递给它的对象引用,凭空的创建出一个全新的词法作用域。 // var a = 10; // 这里可以验证with更改了a变量的值。如果没有定义这个变量,console.log( a );打印的也是2.
// function foo(obj) {
// with (obj) {
// a = 2; // 完全等于赋值操作
// }
// }
// var o1 = {a: 3};
// var o2 = {b: 3};
// foo(o1);
// console.log(o1.a); // 2
//
// foo( o2 );
// console.log( o2.a ); // undefined
// console.log( a ); // 2——不好,a 被泄漏到全局作用域上了!

JavaScript 二、eval 和 with 函数的更多相关文章

  1. JavaScript中Eval()函数的作用

    这一周感觉没什么写的,不过在研究dwz源码的时候有一个eval()的方法不是很了解,分享出来一起学习 -->首先来个最简单的理解 eval可以将字符串生成语句执行,和SQL的exec()类似. ...

  2. javascript 字符串转为对像函数eval("string")

    javascript有一个很有用的函数eval("string")这个函数可以把字符串转换为对象或者可以执行的语句,例如你的代码可以用obj2=eval("documen ...

  3. Javascript脚本 : eval()函数

    Javascript 中 eval(X)函数 是将参数 当做语句来执行 var number1='1+2'; alert(number1); 输出为 '12': var number2=eval('1 ...

  4. Javascript 闭包与高阶函数 ( 二 )

    在上一篇 Javascript 闭包与高阶函数 ( 一 )中介绍了两个闭包的作用. 两位大佬留言指点,下来我会再研究闭包的实现原理和Javascript 函数式编程 . 今天接到头条 HR 的邮件,真 ...

  5. Javascript二(函数详解)

    一.函数            Javascript是一门基于对象的脚本语言,代码复用的单位是函数,但它的函数比结构化程序设计语言的函数功能更丰富.JavaScript语言中的函数是"一等公 ...

  6. 收集JavaScript中常用的方法函数

    本文中,收集了一些比较常用的Javascript函数,希望对学习JS的朋友们有所帮助. 1. 字符串长度截取 function cutstr(str, len) { var temp, icount ...

  7. javascript制作公式编辑器,函数编辑器和图形绘制

    自己是电子信息方向的,因此总是需要处理大量的电路实验.电路数据和电路仿真处理,每次处理数据时候还需要同样的数据很多遍, 又需要关于电路的频率响应和时域响应情况,所以一直有做一个这样公式编辑器的打算了. ...

  8. 深入理解javascript中的立即执行函数(function(){…})()

    投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014-06-12 我要评论 这篇文章主要介绍了深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是 ...

  9. 从头开始学JavaScript (二)——变量及其作用域

    原文:从头开始学JavaScript (二)--变量及其作用域 一.变量 ECMAscript变量是松散型变量,所谓松散型变量,就是变量名称可以保存任何类型的数据,每个变量仅仅是一个用于保存值的占位符 ...

  10. 在javascript中关于变量与函数的提升

    在javascript中关于变量与函数的提升 一.简介 在javascript中声明变量与函数的执行步骤: 1.先预解析变量或函数声明代码,会把用var声明的变量或者函数声明的代码块进行提升操作 2. ...

随机推荐

  1. iOS 3DTouch

    概述 iOS10系统登录中国,在系统中对3D Touch的使用需求更频繁,所以对iOS9中便引入的3D Touch功能做一些了解是很有必要的 详细 代码下载:http://www.demodashi. ...

  2. HDU 4946 Area of Mushroom 共线凸包

    题意是在二维平面上 给定n个人 每一个人的坐标和移动速度v 若对于某个点,仅仅有 x 能最先到达(即没有人能比x先到这个点或者同一时候到这个点) 则这个点称作被x占有 若有人能占有无穷大的面积 则输出 ...

  3. MySQL数据约束和关联查询

    1 默认值deafult:在建表的时候字段后使用 default ,默认值字段允许为null. 2 非空 not null:在建表的时候字段后使用  not null. 非空字段必须赋值,并且不能是n ...

  4. 大型网站技术架构(3):WEB 前端性能优化

    上次说到了性能优化策略,根据网站的分层架构,可以大致的分为 web 前端性能优化,应用服务器性能优化,存储服务器性能优化三大类 这次来说一下 web 前端性能优化,一般来说,web 前端就是应用服务器 ...

  5. Java中RunTime类介绍

    Runtime 类代表着Java程序的运行时环境,每个Java程序都有一个Runtime实例,该类会被自动创建,我们可以通过Runtime.getRuntime() 方法来获取当前程序的Runtime ...

  6. javascript递归、循环、迭代、遍历和枚举概念

    javascript递归.循环.迭代.遍历和枚举概念 〓递归(recursion)在数学与计算机科学中,是指在函数的定义中使用函数自身的方法.递归一词还较常用于描述以自相似方法重复事物的过程.例如,当 ...

  7. ngModelController的方法和属性的使用

    ngModelController方法 $render(); 当视图需要更新的时候会被调用.使用ng-model的指令应该自行实现这个方法. $isEmpty(value); 该方法用于判断输入值是否 ...

  8. yii2 ContentDecorator 和 block 挂件

    在做网站的过程中,大部分的页面结构都是相似的.如都有相同的头部和底部.各个页面这样仅仅是中间的部分不同. Yii中的布局文件就是用来实现这样的功能.如: 布局文件:@app/views/layouts ...

  9. Centos7+PHP5.6+MySQL5.7+Zabbix4.0部署

    Centos7+PHP5.6+MySQL5.7+Zabbix4.0部署 系统版本:CentOS Linux release 7.4.1708 (Core) 最小化安装 内核版本:3.10.0-693. ...

  10. 使用ICSharpCode.TextEditor制作一个语法高亮显示的XML编辑器

    使用ICSharpCode.TextEditor制作一个语法高亮显示的XML编辑器 品高工作流 的流程模拟器中使用了一个具有语法高亮和折叠功能的XML编辑器,其核心就是用了SharpDevelop中的 ...