1

我在 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 语句中的代码。

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

提前致谢。

4

5 回答 5

10

永远不要if在or语句中声明你的函数for

function setMinContentHeight() {
    // removed for clarity
}

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

如果我们处理ECMAScript 规范,根据第 12 章if子句被认为是一个语句(以及for, while, with,try/catch等)。

因此,遵循语义部分的注释:

众所周知,一些广泛使用的 ECMAScript 实现支持FunctionDeclaration使用Statement. 然而,应用于此类FunctionDeclarations的语义实现之间存在显着且不可调和的变化。由于这些不可调和的差异,使用 aFunctionDeclaration作为 Statement结果会导致代码在实现之间不能可靠地移植。建议 ECMAScript 实现要么禁止这种用法,FunctionDeclaration要么在遇到这种用法时发出警告。StatementECMAScript 的未来版本可能会定义用于在上下文中声明函数的替代可移植方式 。

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

于 2013-03-22T14:48:53.023 回答
4

首先,阅读理解函数声明与表达式之间的区别。var functionName = function() {}function functionName() {}现在你有什么?两者都没有,因为函数声明需要位于函数/脚本代码的顶层 -不允许将它们嵌套在块中。它被称为函数语句,是非标准的并且工作方式不同。

把它放在if-block 之外:

// here
if ($("#site-master").length > 0) {
    setMinContentHeight();
}
// or here:
function setMinContentHeight() {
    …
}
于 2013-03-22T14:53:59.237 回答
3
if ($("#site-master").length > 0) {
    setMinContentHeight();
}
function setMinContentHeight() {
        // removed for clarity
}

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

于 2013-03-22T14:48:19.647 回答
2

在定义函数后调用,不要在 if 块内定义函数:

function setMinContentHeight() {
    // removed for clarity
}

if ($("#site-master").length > 0) {
    setMinContentHeight();
}
于 2013-03-22T14:48:24.687 回答
0

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

对:

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

错误的:

n();
var n = function(){ alert('1'); }
于 2013-03-22T14:51:34.230 回答