【问题标题】:Why is there a conflict between variables and functions of the same name in JScript?为什么JAVAScript中同名的变量和函数会发生冲突?
【发布时间】:2010-12-10 12:58:45
【问题描述】:

我有一个名为 age 的变量和一个名为 AGE 的函数。忽略我目前遇到的 JScript 不区分大小写的问题,即 age(dob) 和 AGE(dob) 都可以工作......

为什么 JScript 尝试将年龄变量用作函数?我最好的猜测是 jScript 将函数声明视为声明和表达式......

功能年龄(出生日期){ 返回 cmd.Age(birthDate); }; 变量年龄 = 32; var foo = 年龄; // AGE函数错误

我在 C# 应用程序中使用 ScriptControlClass,并使用 JScript 作为一种简单的嵌入式语言来为我的用户群提供一些简单到中等复杂度的表达式...

【问题讨论】:

  • 如果你停止使用“function foo() {...}”语法并开始使用“var foo = function() {...}”,JavaScript 会变得更容易理解形式。突然之间,函数是您以与任何事物相同的方式引用的对象这一事实变得清晰起来,并开启了 lambda 风格的编码。

标签: c# .net-3.5 javascript jscript.net


【解决方案1】:

确保不要给函数和变量赋予相同的名称。如果你有一个名为 my_cat 的变量和一个名为 my_cat 的函数,JavaScript 将忘记函数应该做什么或你在 my_cat 变量中存储的值。由于这种奇怪的行为,并且由于函数名称区分大小写,因此命名函数的约定与命名变量的约定不同。

【讨论】:

  • 我无法控制我的用户将尝试什么,这就是我运行它的方式,没有这个问题。当然,在所有大写的情况下都有我的功能应该避免冲突......
  • 您的用户现在是您的开发人员 WOOO HOOOO! :)
  • 嗯,我的用户是数据接口专家,他们的工作是将干净的客户端数据转换成合理的处理方式。 :) 所以他们已经是部分开发人员了。实际上是他们要求从 XBASE 表达式迁移到 JavaScript...但是,到目前为止,迁移看起来很丑陋...
【解决方案2】:

在 JScript/javascript 中,函数是第一类对象。所以,函数也是变量,你可以传递、重用、替换等。

这应该可以解释为什么你不能这样做。在出现错误的那一行,不清楚您分配给 foo 的内容:它可能是年龄,即值为 32 的数值变量。但也可能是年龄,即函数变量。

换句话说,这是完全合法的:

function age(birthDate) { 
   return cmd.Age(birthDate); 
};

var d = new Date();
var foo = age;
foo(d);

所以是这样的:

function print42() {
    return 42;
}

print42 = function() {
    return 32;
}

print42(); //legal - returns 32

如果您担心避免冲突,可以尝试将您的函数放在 object 中:

var $$MyProjectName = function()  { 
    var MyFunctionName = function() {
        // do something
    }

}

// later
var $$MyProjectInstance = new $$MyProjectName();
$$MyProjectInstance.MyFunctionName();

注意名称中的“$”。那里没有什么特别的。 '$' 非常适合用作标识符名称的一部分,并且您要确保您的名称是唯一的。然而,多亏了 jQuery 之类的东西,$“秘密”开始出现了,所以你还想添加一些额外的东西来保持独特性。

【讨论】:

    【解决方案3】:

    这是标准的 JavaScript 语法,在此 JavaScript tips 页面上进行了总结。您应该看一下 JavaScript 参考;很多人推荐JavaScript: The Good Parts,作者是 JavaScript 的原作者,但是买书之前还是要好好研究一下。

    【讨论】:

      猜你喜欢
      • 2016-04-21
      • 2014-12-16
      • 1970-01-01
      • 1970-01-01
      • 2016-04-07
      • 2021-08-28
      • 2012-08-10
      • 1970-01-01
      • 2013-04-14
      相关资源
      最近更新 更多