【问题标题】:Javascript function cannot be found找不到 Javascript 函数
【发布时间】:2013-03-22 14:46:20
【问题描述】:

我在 document.ready() 中有以下代码

if ($("#site-master").length > 0) {

    setMinContentHeight();

    function setMinContentHeight() {

        // removed for clarity
    }
}

我只是检查页面是否正确(#site-master),然后调用我的最小高度函数,但是我在 firebug 中收到以下错误:ReferenceError: setMinContentHeight is not defined。

我不是 javascript 专家,但这怎么可能呢?如果我将它移到 document.ready() 之外,该函数就可以工作。我已经检查并到达了 if 语句中的代码。

另外,这是实现我想要的最佳方式吗?

提前致谢。

【问题讨论】:

  • 把你的函数放在调用之上
  • 您应该在使用之前定义该函数
  • 这是一个无效的函数声明位置。
  • 你的函数在声明之前被调用,如果你把它移到全局范围内(即在document.ready()之外)就不会发生这种情况
  • 在非函数声明块的块中声明函数是无效的。不同的浏览器处理这种情况的方式不同。

标签: javascript jquery


【解决方案1】:

从不iffor 语句中声明您的函数:

function setMinContentHeight() {
    // removed for clarity
}

if ($("#site-master").length > 0) {
    setMinContentHeight();
}

如果我们寻址ECMAScript specification,根据Chapter 12if 子句被认为是一个语句(以及forwhilewithtry/catch 等)。

因此,遵循语义部分的NOTE

众所周知,ECMAScript 的几个广泛使用的实现支持 将FunctionDeclaration 用作Statement。然而有 在实施之间的重大和不可调和的变化 应用于此类 FunctionDeclarations 的语义。因为这些 不可调和的差异,使用FunctionDeclaration 作为 Statement 导致代码在 实施。建议 ECMAScript 实现 要么禁止使用FunctionDeclaration,要么发出警告 当遇到这样的用法时。 ECMAScript 的未来版本可能 定义用于在 Statement 上下文。

这意味着在这种情况下我们无法保证一致的行为,因此,如果函数在语句中声明,我们总是会在strict mode中得到异常。 p>

【讨论】:

  • @dystroy 这是最坏的吗? :)
  • 不,没错。您可以确定浏览器以不同方式处理条件块中声明的函数。一个 ecmascript 参考可能会带来更多的代表。
  • @dystroy:规范中没有明确提及。你可以直接指向SourceElement的产生方式
  • @Bergi 好吧,第 12 章中有一些注释。我已将注释添加到答案中。
  • 感谢您添加关于 FunctionDeclarationStatement 的注释以及各种浏览器中不兼容的语法扩展。这是一个有用的教训!
【解决方案2】:

首先,阅读the difference between var functionName = function() {} and function functionName() {} 以了解函数声明与表达式。现在你有什么?两者都没有,因为函数声明需要位于函数/脚本代码的顶层 - 将它们嵌套在块中是not allowed。它被称为function statement,是非标准的并且工作方式不同。

把它放在if-block 之外:

// here
if ($("#site-master").length > 0) {
    setMinContentHeight();
}
// or here:
function setMinContentHeight() {
    …
}

【讨论】:

    【解决方案3】:
    if ($("#site-master").length > 0) {
        setMinContentHeight();
    }
    function setMinContentHeight() {
            // removed for clarity
    }
    

    你需要在全局范围内声明你的函数。

    【讨论】:

    • 不,不是全局作用域:只是作用域的根级别,可能是一个函数。
    【解决方案4】:

    你已经定义了函数并且不在 if 块中定义函数之后调用:

    function setMinContentHeight() {
        // removed for clarity
    }
    
    if ($("#site-master").length > 0) {
        setMinContentHeight();
    }
    

    【讨论】:

      【解决方案5】:

      也许你的浏览器兼容性有问题,但它是这样工作的:

      右:

      n();
      function n(){ alert('1'); }
      

      错误:

      n();
      var n = function(){ alert('1'); }
      

      【讨论】:

      • 否:这仅在范围的根级别有效,在内部条件范围内无效。
      • @dystroy 这也有效: if(true){ n();函数 n(){alert('1');} }
      • 请阅读 Bergi 提供的链接:kangax.github.com/nfe/#function-declarations-in-blocks
      • @dystroy 谢谢,我学到了一些新东西。但是有问题的代码一切都应该工作
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 2012-12-10
      • 2015-11-03
      • 1970-01-01
      相关资源
      最近更新 更多