论坛首页 Web前端技术论坛

eval() 与 window.execScript() 大比拼

浏览 25107 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-11-26  
eval() 与 window.execScript() 表面看起来好像一样,都是让提供的某一段字符串脚本运行,但有谁又知有以下区别呢?
1. 在 FireFox 下 window.execScript() 函数不能运行,而 eval() 在两个浏览器下都能正常运行;
2. window.execScript() 所执行后的脚本上文是针对整个全局域的,而 eval() 对字符串脚本执行的上下文只针对于调用 eval 函数本身的上下文;

现在问题就出来了,有哪位前辈指点一二,有没有办法将 eval() 函数对字符脚本的执行上下文扩大,不是在其函数内部,而改成全局域的上下文呢?

PS:急啊,最近在写一个东东,必须支持两个浏览器的,而实现机制只能通过执行字符脚本的。
   发表时间:2005-11-26  
prototype中的部份代码,有没有参考价值?
Function.prototype.bind = function(object); {
  var method = this;
  return function(); {
    method.apply(object, arguments);;
  }
}


示例应用:
function a(z){
var sum = this.x + this.y + z;
alert(sum);
}

a = a.bind({x:1,y:2});

//下面会alert出6
a(3);
0 请登录后投票
   发表时间:2005-11-27  
swingchen 写道
有没有办法将 eval() 函数对字符脚本的执行上下文扩大,不是在其函数内部,而改成全局域的上下文呢?


eval() 是可以访问global 的context 的,不清楚你的代码是不是有什么特殊的地方
0 请登录后投票
   发表时间:2005-11-27  
醒来 写道
eval() 是可以访问global 的context 的,不清楚你的代码是不是有什么特殊的地方

我的意思不是指 eval() 函数引用全局context的变量,而是让 eval() 函数里的字符代码运行到全局域里。比如说:
function testEval();{
    eval(" var globalV = 'global' ");;
}
testEval();;
alert(globalV);;

上面这段代码,我想在最后一行的alert函数,能引用变量 globalV,当然现在上面这段代码肯定会报 globalV 变量未定义的错误,而如果将 eval() 换成 window.execScript() 则就不会错了。
0 请登录后投票
   发表时间:2005-11-27  
swingchen 写道

function testEval();{
    eval(" var globalV = 'global' ");;
}
testEval();;
alert(globalV);;

上面这段代码,我想在最后一行的alert函数,能引用变量 globalV,当然现在上面这段代码肯定会报 globalV 变量未定义的错误,而如果将 eval() 换成 window.execScript() 则就不会错了。


如果只是为了定义变量在global context,只要把 var 去掉就好了。
0 请登录后投票
   发表时间:2005-11-27  
醒来 写道
如果只是为了定义变量在global context,只要把 var 去掉就好了。

其实把var关键字去除的方式,那也根本没有摆托eval()函数执行的代码所属testEval()函数的context问题,若是以下代码可就没法去除var的方法了:
function testEval();{
    window.execScript(" function GlobalFun();{ return 'globalFun();';} ");;
}
testEval();;
alert(GlobalFun(););;

我的本意还是想通过JavaScript的某种变通的实现方式,让eval()函数真正扩大其执行context域的问题。期待能有解决的办法。。。
谢谢“醒来”对问题的关注^|^
0 请登录后投票
   发表时间:2005-11-28  
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(););;
0 请登录后投票
   发表时间:2005-11-28  
在任何执行eval的上下文中只需将变量直接定义成 window 下的某个“属性”即可成为全局变量。
例如
function test()
{
eval("window.a = '全局变量';");
eval("window.b = function(){alert('全局函数');}");
}
test();
alert(a);
b();
0 请登录后投票
   发表时间:2005-12-14  
我现在也是遇到了相同的问题,答案很无奈,问了很多人都没有办法彻底解决。
我现在解决办法就是 script.replace("var ","window.")
0 请登录后投票
   发表时间:2005-12-14  
hong2 写道
在任何执行eval的上下文中只需将变量直接定义成 window 下的某个“属性”即可成为全局变量。
例如
function test()
{
eval("window.a = '全局变量';");
eval("window.b = function(){alert('全局函数');}");
}
test();
alert(a);
b();


这个应该是答案的。
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics