为什么我会在下面的脚本中出现意外的“(”令牌?

时间:2012-01-25 10:13:09

标签: javascript syntax-error

好的,我知道我在做什么,我故意想要在我的页面上有很多这样的多个脚本,因为这些脚本不应该在加载时进行评估,但是如果我设置type =“something else”那么我不要在开发过程中获得智能感知和验证。

<script type="text/javascript" id="s">
{
    //                <- following '(' is unexpected
    update: function (o){
        alert(o);
    }
}
</script>

然而,当我这样做时,没关系,

<script type="text/javascript" id="s">
{
    update: function x(o){
        alert(o);
    }
}
</script>

注意圆括号前的“x”。问题是,如果我写“x”,则window.x设置为此方法,编写多个脚本会产生更多问题。

当我将其更改为时,

<script type="text/javascript" id="s">
{
    update: function x(o){
        alert("s-update: " + o);
    },
    method: function x(y){
        alert("s-method: " + y);
    }
}
</script>

然后我在method之前得到意外的标记','。

  1. 我想知道如何创建一个JavaScript Object Notation,稍后将通过给出id来执行。请参阅http://jsfiddle.net/MDJbT/处的工作代码,但如果我包含,并且删除了,,则会收到脚本错误,因此我没有收到脚本错误,但我的代码未执行,{{ 3}}。
  2. 我需要在一个框架中允许我们以完全“id”独立的方式编写脚本,这样就不会有任何全局方法的冲突。两个脚本都具有相同的名称,但逻辑不同。唯一的区别是“id”,我知道要引用哪个ID以及调用哪种方法。
  3. 这是复杂框架的一小部分,其中id被自动分配,方法是类层次结构的一部分,它在运行时动态设置,保留范围。
  4. 我根本不希望执行这些脚本。
  5. 我希望以这种方式编写这些脚本,以便Visual Studio和其他编辑器能够精确地显示智能感知并提供有关语法等的错误。
  6. 我将仅通过提供进一步的方法论证,在用户在eval范围内调用的操作上执行这些脚本。

4 个答案:

答案 0 :(得分:5)

Javascript需要提示{ ... }是一个表达式:

 ({
    update: function x(o){
        alert("s-update: " + o);
    },
    method: function x(y){
        alert("s-method: " + y);
    }
})

答案 1 :(得分:2)

<script type="text/javascript" id="s">
({
    update: function(o){
        alert("j-update: " + o);
    },
    method: function(y){
        alert("j-method: " + y);
    }
})
</script>

http://jsfiddle.net/MDJbT/1/

答案 2 :(得分:2)

第二个语句有效,因为update:被解释为标签,而不是对象的键。您必须用括号括起匿名对象才能使其正常工作。

第三个是无效的,因为错误的列表运算符(在这种情况下,被解释为)。

答案 3 :(得分:2)

{表示JavaScript中块的开始,如下面的代码片段(有效语法)所示:

{ var hello = "test" } 

在内部,这被转换为以下序列(记住变量声明被提升而不是块作用域):

  1. 定义变量 hello
  2. 开始使用{
  3. 分隔的块
  4. 将值“test”分配给 Hello
  5. 结束块
  6. 忽略该块,它等同于var hello = "test"。如果我们将相同的逻辑应用于您的代码,那么

    {
        //                <- following '(' is unexpected
        update: function (o){
            alert(o);
        }
    }
    

    被翻译成以下序列:

    1. 开始由{
    2. 分隔的块
    3. 定义标签更新
    4. 开始功能陈述
    5. 抛出语法错误
    6. 忽略块分隔符,代码被解释为:

      update: function (o){
          alert(o);
      }
      

      语法错误的原因是函数语句必须具有名称。在第二个示例中,函数语句有效,因为它具有名称。两个函数语句在第3个中都有名称,但在跟随函数语句时,无效。

      正如其他人所提到的,当你用括号包装整个东西时问题就解决了,因为代码变成了一个表达式,因此也就是法律语法。