3

我们有一个 Backbone / Marionette Web 应用程序。该应用程序在现代浏览器中运行良好,但在 IE8 中死亡

SCRIPT1010: Expected identifier

调试器指向 Underscore.js 库中的一行,而不是我的代码中的一行。显然库中没有问题——我们的代码触发了这个问题。线是这个

var render = new Function(settings.variable || 'obj', '_', source);

问题可能是什么?

4

1 回答 1

12

事实证明,这是我们的一个模板中的一个特定情况,这意味着当模板被编译时,代码在现代浏览器中很好,但在 IE8 中却出现了不稳定。

我们使用 serializeData 函数从我们的视图中传递一些有用的字符串数据,就像这样(coffeescript,但你明白了):

...
serializeData: ->
   data = super()
   data.messages = {
      intro: "Welcome to the app"
      continue: "Click here to continue"
   }
   return data
...

然后像这样在模板中引用它

<h1>{{ messages.intro }}</h1>
<a href="...">{{ messages.continue }}</h1>

问题来自“继续”是保留字这一事实。Coffeescript 很好,它允许您将其用作对象定义中的键而无需引用,并且看起来在更现代的浏览器中的常规 JS 中,他们可以不加引号地使用它(尽管通常会建议这样做)。

然而,在 IE8 中,您可能不会像 obj = { continue: "foo" } 那样设置它,并且您可能不会像 obj.continue 那样得到它,它必须是 obj["continue"]。

将 {{ messages.continue }} 替换为 {{ messages["continue"] }} 或重命名属性可解决问题。

希望对某人有所帮助:)

于 2013-05-03T14:40:39.103 回答