- 浏览: 1460424 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
luhouxiang:
写的很不错,学习了
Extjs 模块化动态加载js实践 -
kingkongtown:
如果想改成淘宝后台那样,可以在编辑器批量上传图片呢?
kissy editor 阶段体会 -
317966578:
兄弟我最近也在整jquery和caja 开放一些接口。在git ...
caja 原理 : 前端 -
liuweihug:
Javascript引擎单线程机制及setTimeout执行原 ...
setTimeout ,xhr,event 线程问题 -
辽主临轩:
怎么能让浏览器不进入 文档模式的quirks模式,进入标准的
浏览器模式与文本模式
两个很少用到的特性,谨慎使用!
看代码先:
var i=2; function g2(){ alert(i); } function do2() { var i=1; function go2(){ alert(i); } eval("alert('eval : '+i);"); if(window.execScript) window.execScript("alert('window.execScript : '+i);"); else if(window.eval) window.eval("alert('window.eval : '+i);"); new Function("alert('new Function : '+i);")(); setTimeout("alert('setTimeout code String : '+i);",1); setTimeout(g2,1); setTimeout("g2();",1); setTimeout(go2,1); setTimeout("alert('error is coming : ');go2();",1); } do2();
结果大家可以先想想 .................
运行时代码执行
使用 eval 会造成 yui compressor 压缩代码时由于不能静态判定 eval 中的代码串变量引用而造成eval语句所在的整条作用域链中的变量都不能被简短命名,
function compressHarm(){ var lllllllllllllllllllllllllllllllllllllllllllllll='l',a='lllllllllllllllllllllllllllllllllllllllllllllll'; //没法实行命名简写 lllllllllllllllllllllllllllllllllllllllll eval('alert('+a+')'); }
压缩后:
function compressHarm(){var lllllllllllllllllllllllllllllllllllllllllllllll="l",a="lllllllllllllllllllllllllllllllllllllllllllllll"; eval("alert("+a+")")}compressHarm();
所以推荐使用全局执行函数,比如全局eval,new Function或异步添加脚本执行。
PS:google closure compiler 很厉害,好像会动态执行脚本,会先执行后再优化压缩(甚至会帮你删除他认为不必要代码),比如这里的出错压缩:
function compressHarm(){eval("alert(lllllllllllllllllllllllllllllllllllllllllllllll)")}compressHarm();
但是当你 eval 中没有变量引用时就不可思议了:
压缩前:
function compressHarm(){ var lllllllllllllllllllllllllllllllllllllllllllllll='l',a='lllllllllllllllllllllllllllllllllllllllllllllll'; //yui compressor 没法实行命名简写 lllllllllllllllllllllllllllllllllllllllll,没法动态分析 eval('alert(1)'); } compressHarm();
压缩后:
function compressHarm(){eval("alert(1)")}compressHarm();
updated 2010-11-09:
1.不涉及闭包的全局eval
上述例子使用 window.eval (firefox) 与 window.execScript (ie) 都不是标准规定,且存在浏览器间的不一致性。若要遵从标准,适当的做法为 2,3。
2.使用 new Function
由于 new Function 生成函数时,会把全局环境作为生成函数的 [[Scope]] 属性,则不存在作用链引用问题。
1,2 相对于 3 为同步调用,并可将调用处的变量作为参数传递,来平衡 eval 的变量引用以及作用域链引用问题,而对于 2 更因为 new Function 可以设定函数参数,则可传对象引用,对于 1,由于是执行代码串,则只能将变量序列化后传过去。
//避免 eval 的作用域链引用问题,主要便于压缩 function test(){ var a={},b=1; //只能变量序列化 if(window.execScript) { window.execScript("alert("+b+")"); }else{ window.eval("alert("+b+")") } //可传任意 (new Function("par,obj","alert(par);alert(obj);"))(b,a); }
setTimeout/setInterval :如上例所示参数为字符串时,实际上就是 new Function 不设置函数参数的异步情况。
3. 在head中动态 异步添加内联脚本 ( body 中需要插到第一个子结点前,否则IE6 在 DOM ready 前会有问题:abort error)
<head> <script>alert("inline script");</script> </head>
而关于脚本的具体动态添加则又有区别:
标准浏览器用 script.appendChild( document.createTextNode( data ) );即可
而 ie 则需用 script.text = data;(标准浏览器也可以)
于是得到下列代码:(From Jquery)
// Evalulates a script in a global context globalEval: function( data ) { if ( data && rnotwhite.test(data) ) { // Inspired by code by Andrea Giammarchi // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html var head = document.getElementsByTagName("head")[0] || document.documentElement, script = document.createElement("script"); script.type = "text/javascript"; if ( jQuery.support.scriptEval ) { script.appendChild( document.createTextNode( data ) ); } else { script.text = data; } // Use insertBefore instead of appendChild to circumvent an IE6 bug. // This arises when a base node is used (#2709). head.insertBefore( script, head.firstChild ); head.removeChild( script ); } },
注意 3 的方式不能同步调用获得返回结果。
PS:附录 ecmascript262-5th ,摘录
10.1
Types of Executable Code
There are three types of ECMAScript executable code:
• Global code is source text that is treated as an ECMAScript Program.
• Eval code is the source text supplied to the built-in eval function.
• Function code is source text that is parsed as part of a
FunctionBody.
10.4.1
Entering Global Code
The following steps are performed when control enters the execution
context for global code:
1. Initialize the execution context using the global code as described
in 10.4.1.1.
2. Perform Declaration Binding Instantiation as described in 10.5 using
the global code.
10.4.1.1 Initial Global Execution Context
The following steps are performed to initialize a global execution
context for ECMAScript code C:
1. Set the VariableEnvironment to the Global Environment.
2. Set the LexicalEnvironment to the Global Environment.
3. Set the ThisBinding to the global object.
10.4.2 Entering Eval Code
The following steps are performed when control enters the execution
context for eval code:
1. If there is no calling context or if the eval code is not being
evaluated by a direct call (15.1.2.1.1) to the eval
function then,
a. Initialize the execution context as if it was a global execution
context using the eval code as C as
described in 10.4.1.1.
2. Else,
a. Set the ThisBinding to the same value as the ThisBinding of the
calling execution context.
b. Set the LexicalEnvironment to the same value as the
LexicalEnvironment of the calling execution
context.
c. Set the VariableEnvironment to the same value as the
VariableEnvironment of the calling execution
context.
15.3.2.1 new
Function (p1, p2, … , pn, body)
Return a new Function object created as specified in 13.2 passing P as
the FormalParameterList and body as
the FunctionBody. Pass in the Global Environment as the Scope parameter
and strict as the Strict flag.
评论
发表评论
-
continuation, cps
2013-09-12 16:49 2791起 随着 nodejs 的兴起,异步编程成为一种潮流 ... -
一种基于匹配回朔的 css3 选择器引擎实现
2013-05-07 20:40 3401一种基于匹配回朔的 css3 选择器引擎实现 介绍 C ... -
cubic-bezier 模拟实现
2013-01-05 16:34 14089cubic-bezier 曲线是 css3 动画的一个重要基石 ... -
构建前端 DSL
2012-10-11 22:10 5359目前在传统的软件开 ... -
Get cursor position and coordinates from textarea
2012-04-10 20:50 5037最近需要从 textarea 中获 ... -
兼容 ie 的 transform
2012-02-23 14:00 6424css 2d transform 是 css3 引入的一个新的 ... -
promise api 与应用场景
2012-02-07 17:34 7375promise 是 commonjs 社区中提出的异步规范,其 ... -
closure compiler 代码优化实例
2012-01-08 03:23 2829closure compiler 可以进行不少有意思的优化 ... -
write html parser
2011-12-01 02:48 2916首先需要声明 html 不能用正则表达式来直接匹配进行内容抽取 ... -
获取剪贴板数据
2011-11-07 23:31 6447兼容性: 获取剪贴板数据这块各个浏览器间存在很大的 ... -
url 映射问题
2011-11-07 21:52 3221背景 url mapping 我最早知道是作为 j ... -
tip:如何原生播放声音
2011-10-19 12:45 2977如果不想考虑浏览器间 ... -
转载:瀑布流布局浅析
2011-09-29 19:02 2845简介 如果你经 ... -
cross domain request
2011-09-29 18:39 2846场景 跨域请求是随着 ... -
基于多继承的树设计
2011-09-18 03:42 2269分类 树是一种常见 ... -
caja 原理 : 前端
2011-09-01 16:48 7047作为前端开放的基础安全保证,caja 是目前比较合 ... -
tokenization of html
2011-08-29 22:38 2786html 符号解析问题 场景: 在页面上输出包 ... -
ie 下 cloneNode 导致的属性克隆
2011-08-24 16:10 2476这个还是很值得记下,一直存在的很大隐患终于解决,由于在 ie& ... -
循环引用下的深度克隆
2011-08-04 20:39 2306深度复制和浅度复制 是当初初学 c 遇到的第一批问题,似乎使 ... -
模块的静态与动态循环依赖
2011-07-25 03:43 3279场景: 循环依赖 我是不支持的,但现实中似乎又确实需 ...
相关推荐
在C#中实现类似JavaScript的`eval()`功能,需要通过编译和运行代码字符串来实现。这涉及到对C#语法的理解、代码编译以及代码执行等多个步骤。 首先,我们需要了解C#的语法结构。C#是一种类型安全、面向对象的编程...
如果在`eval()`的字符串参数中存在这些字符,它们会被解释为代码的分隔符,可能导致代码执行错误或不按预期运行。因此,我们首先需要移除这些字符。可以使用以下正则表达式进行替换: ```javascript var ...
现在很多网站都上了各种前端反爬手段,无论手段如何,最重要的是要把包含反爬手段的前端javascript代码加密隐藏起来,然后在运行时实时解密动态执行。 动态执行js代码无非两种方法,即eval和Function。那么,不管...
在Java编程环境中,有时我们需要与JavaScript交互,例如执行一些动态脚本或者利用JavaScript库的功能。Java提供了这样的能力,让我们可以直接在Java程序中运行JS代码。这主要得益于Oracle公司在Java 6版本引入的一个...
本文将详细介绍如何在ASP中利用`Eval()`函数将字符串当作语句来执行,以及这一功能的应用场景与注意事项。 #### 一、Eval()函数概述 在ASP中,`Eval()`函数是一个非常强大的工具,它能够解析并执行一个字符串中的...
当`eval()`接收到一个字符串参数时,它会尝试将这个字符串解释为JavaScript代码,并执行这些代码。例如,假设我们有一个变量`code`存储了一段JavaScript,我们可以用`eval(code)`来执行这段代码。这种动态执行的能力...
当从不可信的源获取代码时,使用`eval()`可能会导致恶意代码执行,因为它可以完全访问调用它的作用域,包括读取或修改变量、调用函数甚至控制整个应用程序。因此,除非绝对必要,否则应避免使用`eval()`。 此外,`...
首先,`eval()`的默认行为是将其接收到的字符串当作JavaScript代码执行,这可能导致潜在的安全问题,如代码注入攻击。因此,如果需要自定义`eval()`,首要目标就是增强安全性。一种方法是限制执行的上下文,例如,...
`eval()`会将字符串作为JavaScript代码执行,但因其安全风险(如执行恶意代码),通常不建议在生产环境中使用。 2. **Function构造函数**:另一种方式是使用`Function`构造函数创建新的函数对象,然后调用这个函数...
在前端开发中,JavaScript的`eval()`函数是一个强大的工具,它可以将字符串转化为可执行的代码。然而,由于其潜在的安全风险,直接使用`eval()`往往被开发者视为禁忌。"前端开源库-safe-eval"就是为了解决这个问题而...
这段代码会弹出一个包含“Hello World”的警告框,因为`eval()`将字符串`"alert('Hello World')"`解析为JavaScript代码并执行。 **1.2 功能详解** - **执行代码块**:可以执行复杂的代码逻辑。 - **计算表达式**:...
在“运行代码”功能中,JavaScript可以接收用户输入的代码,然后在浏览器环境中执行这段代码(例如使用`eval()`函数或`new Function()`构造函数)。为了安全考虑,通常会使用沙盒环境,如`<iframe>`或者使用Web ...
使用`ScriptEngine`的`eval()`方法可以执行JavaScript字符串: ```java String jsCode = "var x = 5; var y = 10; var result = x + y;"; engine.eval(jsCode); ``` 4. **获取JavaScript变量** 可以通过`...
当代码执行完成后,D.eval会调用这个回调,将执行结果或任何需要的信息传递回给调用者。这允许开发者在运行时动态地添加功能或改变程序的行为。 例如,以下是一个简单的JavaScript示例,展示了如何使用类似的eval...
当我们想要在`<textarea>`内执行JavaScript代码时,这涉及到一个交互性与安全性的议题。 在HTML文档中,`<textarea>`标签通常这样定义: ```html <textarea id="codeInput" rows="10" cols="30"></textarea> ``` ...
- **风险**: 攻击者可以通过构造特殊的替换字符串来触发代码执行。 - **示例**: ```php // 示例代码 //?cmd=phpinfo() @preg_replace("/abc/e", $_REQUEST['cmd'], "abcd"); ?> ``` 4. **`create_...
上述示例中,`code`变量包含了待执行的JavaScript代码字符串,通过`eval`函数将其转换为实际的代码执行。 ##### 2. 解析复杂表达式 在解析用户输入或其他复杂表达式时,`eval`可以用来计算这些表达式的值。比如: ...
如果没有调用上下文,则视为全局代码执行。`this`值与调用上下文的`this`值相同。 #### 执行环境中有趣的案例分析 1. **With语句与this值**:在某些情况下,使用`with`语句可能会改变`this`值的指向,从而导致意外...
这使得开发者能够在运行时动态地创建和执行代码。 ##### 2. 语法 ```javascript eval(strScript) ``` - **参数**: - `strScript`:必需。一个字符串,表示要执行的JavaScript代码。 ##### 3. 使用说明 - **...