//载自:
http://www.javaeye.com/post/103466
eval() 与 window.execScript() 表面看起来好像一样,都是让提供的某一段字符串脚本运行,但有谁又知有以下区别呢?
1. 在 FireFox 下 window.execScript() 函数不能运行,而 eval() 在两个浏览器下都能正常运行;
2. window.execScript() 所执行后的脚本上文是针对整个全局域的,而 eval() 对字符串脚本执行的上下文只针对于调用 eval 函数本身的上下文;
现在问题就出来了,有哪位前辈指点一二,有没有办法将 eval() 函数对字符脚本的执行上下文扩大,不是在其函数内部,而改成全局域的上下文呢?
----------------------------------------------------------------------
swingchen 写道
代码
- function testEval(){
- eval(" var globalV = 'global' ");
- }
- testEval();
- alert(globalV);
上面这段代码,我想在最后一行的alert函数,能引用变量 globalV,当然现在上面这段代码肯定会报 globalV 变量未定义的错误,而如果将 eval() 换成 window.execScript() 则就不会错了。
如果只是为了定义变量在global context,只要把 var 去掉就好了。
-----------------------------------------------------------------------
醒来 写道
如果只是为了定义变量在global context,只要把 var 去掉就好了。
其实把var关键字去除的方式,那也根本没有摆托eval()函数执行的代码所属testEval()函数的context问题,若是以下代码可就没法去除var的方法了:
代码
- function testEval(){
- window.execScript(" function GlobalFun(){ return 'globalFun()';} ");
- }
- testEval();
- alert(GlobalFun());
我的本意还是想通过JavaScript的某种变通的实现方式,让eval()函数真正扩大其执行context域的问题。期待能有解决的办法。。。
谢谢“醒来”对问题的关注^|^
-----------------------------------------------------------------------
swingchen 写道
其实把var关键字去除的方式,那也根本没有摆托eval()函数执行的代码所属testEval()函数的context问题,若是以下代码可就没法去除var的方法了:
代码
- function testEval(){
- window.execScript(" function GlobalFun(){ return 'globalFun()';} ");
- }
- testEval();
- alert(GlobalFun());
我的本意还是想通过JavaScript的某种变通的实现方式,让eval()函数真正扩大其执行context域的问题。期待能有解决的办法。。。
谢谢“醒来”对问题的关注^|^
函数也可以是一个变量, 还是和去掉 var 一样的道理
代码
- function testEval(){
- window.eval("GlobalFun = function(){ return 'globalFun()';} ");
- }
- testEval();
- alert(GlobalFun());
----------------------------------------------------------------
hong2 写道
在任何执行eval的上下文中只需将变量直接定义成 window 下的某个“属性”即可成为全局变量。
例如
function test()
{
eval("window.a = '全局变量';");
eval("window.b = function(){alert('全局函数');}");
}
test();
alert(a);
b();
这个应该是答案的。
-------------------------------------------------------------
看一下《征服 Ajax ---Web 2.0 开发技术详解》 P/132 ,动态添加,修改,删除对象的属性和方法。
var user = new Object();
1. 添加属性
user.name = "jack";
user.age = 21;
2.添加方法
user.alert = function (){
alert("my name is :" + this.name);
}
执行这个方法: user.alert();
............
同理这个 window.a = '全局变量';也就是为window增加了一个属性 a .
与 4 相似的讨论:
请问onblur()以后为何得不到焦点?
ff下正常,ie不正常的话可以考虑延时一段时间执行focus()
|
|
|
|
2# 大 中 小 发表于 2007-1-8 17:55
只看该作者
|
|
|
|
用全局变量保存对象指针 在setTimeout发动时,函数checkEmail的生命周期已经结束,函数内部的变量control已经不存在了。
|
|
|
|
为什么我在setTimeout之后仍然可以使用control? (我的是ff1.0.x,ie下还没试过)
|
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
</HEAD>
<BODY>
<input type="text" onblur=chk(this)><br>
<input type="text" onblur=chk(this)>
<script>
function chk(bb){
window.hutia=bb;
execScript("n = msgbox(window.hutia.value,35,'Microsoft Internet Explorer')","vbs");
alert(n);// n = 6 是 ,7 不是 ,2 取消.
}
</script>
</BODY>
</HTML>