Javascript闭包和执行上下文 - evalled代码的问题

时间:2011-06-29 10:53:30

标签: javascript eval

我认为我的闭包和执行上下文有问题,虽然我不太确定。

让我解释一下我正在尝试做什么以及为什么我按照我的方式对其进行编码:

1)我正在构建一个javascript驱动的界面,界面包含不同的应用程序(我称之为小部件)。

2)所有小部件都是可移动/可拖动/可关闭/可调整大小等。我正在尝试实现类似桌面界面的东西,尽管必须要说的是我所拥有的远远不如基于Web的操作系统。但这就是我的目标。

3)所以我需要一种方法让JS代码加载每个小部件,而不知道存在哪些小部件和/或其他任何小部件。我决定在加载界面时应该调用php脚本来找出小部件的名称。

4)JS代码具有每个小部件的名称,它现在循环遍历所有调用另一个PHP脚本,这个php脚本将反馈用于加载特定小部件的代码和用于显示它的html代码。 JS将元素附加到屏幕上以显示,然后加载小部件的JS代码。

5)这是棘手的部分,实际上为每个小部件加载代码,我这样做:

var func=new Function(ajax.responseText);
func();

它工作正常,或者似乎至少。

6)现在我遇到了对象和数组的问题,我认为它与执行上下文有关。

数组示例:

var myArray=new Array('foo', 'bar', 'fooBar', 'barFoo');

对我来说没问题,实际数组没有问题(除非我输入错误:)没有我的Net Beans编辑器就无法工作了)我尝试将其作为一个单独的脚本运行,它工作正常,即;使用:alert(myArray[0]);生成foo

数组问题:

我的JS代码无法对此数组做任何有用的事情,因为实际调用alert(myArray[0]);会导致foo, bar, fooBar, barFoo ..不知道为什么会发生这种情况,但它现在真的搞乱了所有内容。

对象示例:

var myObject=new Object();
myObject.a='foo';
myObject.b='bar';
myObject.c='fooBar';
myObject.d='barFoo';

同样,对象在自己运行时工作正常。

对象问题:

与数组非常相似的问题,调用alert(myObject['a']);实际上会导致[object Object],[object Object],[object Object], [object Object] ......

...所以这和数组的问题一样,但如果我调用alert(myObject.a);(请注意我这次没有使用['a'])它会变得更糟结果为undefined

所以要稍微回溯一下,进一步解释一切都在一起的方式:

1)当JS加载时,它将调用一个php脚本,该脚本返回一个包含3个键('functions','JSscript','Other')的JSON编码对象。每个键包含另一个javacript文件的源代码。这些都是使用动态创建的函数加载的,如:var func=new Function(ajax.responseText)

2)然后是这些新的javascript代码调用另一个PHP脚本以获取更多指示。

3)Php以JSON响应,JSON在动态创建的函数内部进行评估并存储在新变量中。

4)新变量现在是一个包含3个键的对象(html, javascript, anotherObject) html附加到文档中,javscript在上面的新函数中执行。

5)问题来自于我在上一个语句中执行的JS中存在的对象/数组。

所以,如果有人能帮助我,我会很高兴,如果你需要进一步的解释或代码示例,那么显然我很乐意提供。

谢谢,

理查德

2 个答案:

答案 0 :(得分:0)

可能是你没有解析你的ajax响应文本。

答案 1 :(得分:0)

Ohhhh ..原来这与闭包或任何其他javascript无关,抱歉让你们大家都兴奋。

它是由一个PHP脚本引起的,甚至不是处理ajax请求的php脚本,它实际上是读取javascript文件然后JSON它们的脚本。该脚本还有一个查找和替换功能,就像一个简单的模板系统,它会找到'['& amp; '''遗憾的是,javascript中的任何数组都会被搞砸。

我使用了find并替换为方括号,因为它最初是用于html模板化的,当我开始在我的JS代码中使用系统时,我只是没有正确考虑它。

因此,为了澄清,我的php脚本会将obj[var].description的JS更改为有效JS的obj.description,所以没有标记任何错误让我注意到它。

Ohhhhh。真是个失败者:)