JavaScript 二、eval 和 with 函数

/* * ========================================================= * * 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 被泄漏到全局作用域上了!
时间: 2024-08-07 22:09:16

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

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

javascript有一个很有用的函数eval("string")这个函数可以把字符串转换为对象或者可以执行的语句,例如你的代码可以用obj2=eval("document.a.c"+i),另外你还可以这样写eval("alert()"),eval("a+=2"),这样你就可以让用户输入的javascript语句执行 你的docheck()如此改即可:function docheck(){ obj1=eval("do

JavaScript中eval函数

JavaScript中eval函数是检查 JavaScript代码并执行. 使用方法: eval(codeString) 其中必选项 codestring 参数是包含有效 JScript 代码的字符串值.这个字符串将由 JScript 分析器进行分析和执行. eval 函数允许 JScript 源代码的动态执行.例如,下面的代码创建了一个包含 Date 对象的新变量 mydate :http://www.hrbfc120.com eval("var mydate = new Date();&qu

JavaScript中Eval()函数的作用

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->首先来个最简单的理解 eval可以将字符串生成语句执行,和SQL的exec()类似. eval的使用场合是什么呢?有时候我们预先不知道要执行什么语句,只有当条件和参数给时才知道执行什么语句,这时候eval就派上用场了.举个例子: 我们要做一个function(),功能是输入网页中两个个对象的名称,然后程

收集JavaScript中常用的方法函数

本文中,收集了一些比较常用的Javascript函数,希望对学习JS的朋友们有所帮助. 1. 字符串长度截取 function cutstr(str, len) { var temp, icount = 0, patrn = /[^\x00-\xff]/, strre = ""; for (var i = 0; i < str.length; i++) { if (icount < len - 1) { temp = str.substr(i, 1); if (patrn.

javascript中的立即执行函数(function(){…})()

javascript中的立即执行函数(function(){…})() 深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是用(function(){…})()包住业务代码,使用jquery时比较常见. ( function(){…} )()和( function (){…} () )是两种javascript立即执行函数的常见写法,最初我以为是一个括号包裹匿名函数,再在后面加个括号调用函数,最后达到函数定义后立即执行的目的,后来发现加括号的原因并非如此.要

javascript语法基础-变量与函数

三 javascript语法基础-变量与函数 (一)变量的声明与运用 JavaScript中的变量与Java.C等强类型语言有很大区别,虽然在JavaScript中具有字符串.数字等数据类型. 变量申明语句的结构是var保留字加标识符,var和标识符之间用空格隔开. 赋值语句的结构是在变量和需要赋的值之间加上一个等号,例如a=1的含义是将变量a的值指定为1. 变量在定义的时候也可以同时赋值,如var a=1. PS:在变量使用前事先进行声明是个良好的编程习惯,这对将来学习Java等其他语言有帮助

【javascript基础】2、函数

原文:[javascript基础]2.函数 前言 我在上一篇[javascript基础]基本概念中介绍了javascript的一些基本概念,多谢大家的阅读和意见,自己写的东西可以被大家阅读,真心高兴,刚开始发布的时候我一直盯着阅读人数,虽然知道大家可能就是点开一下而已,但是还是给我一些继续写下去的信心.那今天写一些关于javascript函数的一些知识,帮助大家熟悉或者复习一些函数的基本知识. PS:最近jQuery源码交流群( 239147101)加了不少热新人,希望大家还是以学习为主,尽量少

javascript闭包和立即执行函数的作用

一.闭包--closure 先看一个闭包的例子.我们想实现一个计数器,最简单的方法就是定义一个全局变量,计数的时候将其加1.但是全局变量有风险,哪里都有可能不小心改掉它.那局部变量呢, 它只在函数内部有效,函数调用完后它就没了,而且全局没法使用.那我们用想让计数器全局使用,又不想让这个变量被随便修改怎么办.这就需要闭包了: function count(){ var i=0; return function () { return ++i; } } 这个例子实现了一个简单的计数器.函数"coun

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

原文:从头开始学JavaScript (二)--变量及其作用域 一.变量 ECMAscript变量是松散型变量,所谓松散型变量,就是变量名称可以保存任何类型的数据,每个变量仅仅是一个用于保存值的占位符. 定义:var firstDemo; 二.变量的作用域 2.1基本概念 使用var 定义变量:定义该变量的作用域的局部变量,这种定义变量的方法也被成为显式声明. 这么说不理解的话可以看看下面这个简单粗暴的例子: test();function test(){var firstDemo="hello

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

这篇文章主要介绍了深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是用(function(){-})()包住业务代码,使用jquery时比较常见,需要的朋友可以参考下http://www.jb51.net/article/50967.htm javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花,当然,能理解各型各色的写法也是对javascript语言特性更进一步的深入理解. ( function()