2013-03-22 3 views
1

У меня есть следующий код в document.ready()функция Javascript не может быть найдена

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

    setMinContentHeight(); 

    function setMinContentHeight() { 

     // removed for clarity 
    } 
} 

Я просто проверить, если страница правильно (# сайт-мастер), затем вызвать мою минимальную функцию высоты, однако я 'm получает следующую ошибку в firebug: ReferenceError: setMinContentHeight не определен.

Я не эксперт по javascript, но как это может быть? Функция работает, если я перемещаю ее за пределы document.ready(). Я проверил и код внутри оператора if.

Кроме того, это лучший способ добиться того, чего я хочу?

Заранее благодарен.

+1

поставить функцию выше вызова –

+1

вы должны определить эту функцию, прежде чем использовать его – obivandamme

+2

Это недопустимое место для функции декларации. – Bergi

ответ

10

Никогда объявлять функции внутри if или for заявления:

function setMinContentHeight() { 
    // removed for clarity 
} 

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

Если обратиться к ECMAScript specification, в соответствии с пунктом Chapter 12, if считается Заявление (а также for, while, with, try/catch и т. д.).

Следовательно, после ПРИМЕЧАНИЯ из семантики раздела:

Several widely used implementations of ECMAScript are known to support the use of FunctionDeclaration as a Statement . However there are significant and irreconcilable variations among the implementations in the semantics applied to such FunctionDeclarations. Because of these irreconcilable differences, the use of a FunctionDeclaration as a Statement results in code that is not reliably portable among implementations. It is recommended that ECMAScript implementations either disallow this usage of FunctionDeclaration or issue a warning when such a usage is encountered. Future editions of ECMAScript may define alternative portable means for declaring functions in a Statement context.

Это означает, что мы не можем гарантировать последовательное поведение в таких случаях, и, как результат, мы всегда получим исключение в strict mode в случае, если функция была заявлена ​​в заявлении .

+0

+1 потому что так много плохих ответов здесь ... –

+0

@dystroy Это лучшее из худшего? :) – VisioN

+0

Нет, это правильно. Вы могли бы уточнить, что браузеры обрабатывают функцию, объявленную в условных блоках по-разному. И ссылка на экстернат, вероятно, принесет больше репутации. –

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

Вам необходимо объявить свою функцию в глобальном масштабе.

+6

Нет, не глобальная область: просто на уровне корня области, которая может быть функцией. –

2

Поместите вызов после вы определили функцию и не определять функции внутри блока, если:

function setMinContentHeight() { 
    // removed for clarity 
} 

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

Может быть, у вас есть проблемы с совместимостью браузеров, но это работает так:

право:

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

неправильно:

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

Нет: это действует только на корневом уровне области действия, а не во внутренней условной области. –

+0

Можете ли вы показать мне, когда это недействительно? – karaxuna

+0

@dystroy это тоже работает: if (true) { n(); Функция n() {alert ('1');} } – karaxuna

3

Во-первых, прочитать на the difference between var functionName = function() {} and function functionName() {} понимать объявления функций против выражения. Теперь, что у вас есть? Ничего из них, так как объявления функций должны быть на верхнем уровне кода функции/скрипта - вложенность их в блоки - not allowed. Он называется function statement, нестандартен и работает по-разному.

Положите его вне if -блока:

// here 
if ($("#site-master").length > 0) { 
    setMinContentHeight(); 
} 
// or here: 
function setMinContentHeight() { 
    … 
} 
Смежные вопросы