无法找到Javascript函数

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

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

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

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

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

提前致谢。

永远不要iffor语句中声明你的函数:

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

如果我们解决ECMAScript规范 ,根据第12章if子句被认为是一个Statement (以及forwhilewithtry/catch等)。

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

已知几种广泛使用的ECMAScript实现支持将FunctionDeclaration用作Statement 。 然而,在应用于此类FunctionDeclarations的语义中的实现之间存在显着且不可调和的变化。 由于这些不可调和的差异,使用FunctionDeclaration作为Statement导致代码在实现中无法可靠地移植。 建议ECMAScript实现不允许使用FunctionDeclaration或在遇到此类用法时发出警告。 ECMAScript的未来版本可以定义用于在Statement上下文中声明函数的替代可移植方法。

这意味着我们无法保证在这种情况下的一致行为,因此,如果在语句中声明了函数,我们将始终在strict mode下获得exception。

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

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

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

把它放在if -block之外:

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

在定义函数放置调用并且不在if块中定义函数:

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

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

对:

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

错误:

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