【问题标题】:Javascript question on functions关于函数的 Javascript 问题
【发布时间】:2010-04-20 15:36:21
【问题描述】:

在我的主网页(Viewer.aspx)中,我有一个像这样的 javascript 脚本标签

<script language="javascript" type="text/javascript">

function initialize() {
     var map = $find('Map1');           
     map.add_mouseMove(mouseMove);  

 }

</script>

在这些脚本标签中,我有一个函数。是否可以像这样调用位于不同脚本标签中的另一个函数?

<script language="javascript" type="text/javascript" src="Resources/JavaScript/proj4js-combined.js">

function mouseMove(sender,eventArgs) {
     var source = new Proj4js.Proj('EPSG:3116');
        var dest = new Proj4js.Proj('WGS84');

        var p = new Proj4js.Point(px, py);
        Proj4js.transform(source, dest, p);    
 }

</script>

【问题讨论】:

  • 当然它没有显示我试图显示的脚本标签。第一个脚本标签就像 script language="javascript" type="text/javascript"
  • @Josh,我已经为你解决了这个问题。发布代码时,您需要单击二进制按钮,以便正确格式化。另外,您是否尝试过检查代码以查看它是否有效? :)
  • 第二个就像 script language="javascript" src="Resources/JavaScript/proj4js-combined.js"
  • 您的第二个标签似乎同时具有src 内联内容,我认为大多数浏览器都无法处理。你需要单独的标签(但是是的,它们可以互相调用函数)。
  • 作为 T.J.说,绝对不要将脚本标签与src 和内联内容结合起来。这太混蛋了,如果你要拥有外部 Javascript,你不妨在外部 JS 文件中拥有所有(或尽可能多)。

标签: javascript proj4js


【解决方案1】:

是的,这是很常见的,因为 Javascript 函数可以放入其他文件并拉入以这种方式工作的页面。

【讨论】:

    【解决方案2】:

    您的第二个脚本标签指定了src。 .js 文件的内容将被加载和解析,但脚本标签内的代码(mouseMove 函数)将被忽略。如果你想要.js文件的功能和内容,你需要将它们分成两个不同的脚本标签。

    【讨论】:

      【解决方案3】:

      根据您的评论,这是 T.J.正在谈论 - 你需要把你的第二个脚本块变成这样的东西:

      <script type="application/javascript" src="Resources/JavaScript/proj4js-combined.js"></script>
      <script type="application/javascript">
      
      function mouseMove(sender,eventArgs) {
           var source = new Proj4js.Proj('EPSG:3116');
              var dest = new Proj4js.Proj('WGS84');
      
              var p = new Proj4js.Point(px, py);
              Proj4js.transform(source, dest, p);    
       }
      
      </script>
      

      ...但是您实际上应该将内联代码块(我的答案中第二个 &lt;script&gt; 标记内的内容)移动到外部 Javascript 文件中。


      编辑 1:您的编程背景是什么?如果它是 C# 或 Java 之类的东西,您将需要忘记您对这些的了解并以完全不同的方式处理 Javascript。 Javascript 是一种解释语言,而不是编译语言;除此之外,这意味着函数声明的顺序很重要

      当我说“函数声明”时,我指的是任何看起来像这样的东西:

      function myNewFunction()
      {
         // anything else here
      }
      

      这告诉 Javascript 解释器有一个新函数,称为 myNewFunction,它的主体由大括号中的任何内容组成。

      这是我所说的一个例子,当我说你在声明一个函数之前就使用它。考虑以下代码块(与任何其他 Javascript 隔离,例如在外部 Javascript 文件中):

      function foo() // this line declares the function called "foo"
      {
      
      }
      
      function bar() // this line declares the function called "bar"
      {
          foo(); // this line invokes the previously declared function called "foo"
      }
      

      这将按预期工作,因为foo() 在您调用它之前已声明。但是,您尝试做的(听起来)与此类似:

      function foo() // this line declares the function called "foo"
      {
          bar(); // this line tries to invoke the function called "bar"
                 // but it hasn't been declared yet! so it's undefined
      }
      
      function bar() // this line declares the function called "bar"
      {
      
      }
      

      如果你要运行第二个 Javascript sn-p,它不会工作,因为你在声明之前调用了一个函数。*

      *脚注:实际情况并非如此,因为使用这种语法 (function foo() { ... }) 在 Javascript 中做了一些特别而神奇的事情。我的特定示例实际上会起作用,但它说明了您遇到的问题。

      【讨论】:

      • 这对我来说很有意义,谢谢。我仍然觉得 mouseMove 是未定义的,所以我需要在 map.add_mouseMove(mouseMove) 上做任何额外的事情来让它跳转到那个函数吗??
      • 听起来您在定义 mouseMove 函数之前调用了 map.add_mouseMove(mouseMove)。执行map.add_mouseMove(mouseMove)的代码在哪里?
      • 在我最初的帖子中,这几乎就是我所拥有的。我在第二个脚本标签中加入了您和其他人建议的附加代码,仅此而已
      • 这不可能,因为您的问题表明您仍在组合内联和外部脚本标签。但是,看起来我是对的,您在定义 mouseMove 函数之前调用了 map.add_mouseMove
      • 在名为 initialze 的函数上方的第一个脚本标记中,我有这段代码 Sys.Application.add_init(initialize);我不太明白您所说的“定义 mouseMove 函数”是什么意思。即使它在另一个脚本标签中,我也不能简单地调用该函数?抱歉,我还在学习中
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多