无法找到Javascript函数
我在document.ready()中有以下代码
if ($("#site-master").length > 0) { setMinContentHeight(); function setMinContentHeight() { // removed for clarity } }
我只是检查页面是否正确(#site-master),然后调用我的最小高度函数,但是我在firebug中遇到以下错误:ReferenceError:setMinContentHeight未定义。
我不是javascript专家,但这怎么可能呢? 如果我将它移到document.ready()之外,该函数可以工作。 我已经检查过了if语句中的代码。
此外,这是实现我想要的最佳方式吗?
提前致谢。
永远不要在if
或for
语句中声明你的函数:
function setMinContentHeight() { // removed for clarity } if ($("#site-master").length > 0) { setMinContentHeight(); }
如果我们解决ECMAScript规范 ,根据第12章 , if
子句被认为是一个Statement (以及for
, while
, with
, try/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'); }