2014-10-07 3 views
1

У меня есть страница, которая загружает файл вверху, содержащему большинство моих функций JQuery.Загрузите функцию, которая выходит за рамки

Так в файл например .:

$().ready(function() { 
    function foo(){ 
    doSomething; 
    } 
} 

Теперь, в конце этой конкретной страницы я хочу использовать одну из функций в файл загружен ранее.

Когда я звоню foo();, он говорит foo is not defined, который я получаю, мой вопрос в том, могу ли я назвать эту функцию? И если да, то как?

Я также попытался:

window.onload = function(e){ 
    foo(); 
} 

но та же ошибка

+0

Если файл загружен ранее имеет 'Foo' заявил - он должен быть доступен. – tymeJV

+1

Вам нужно будет сделать часть 'foo' части глобального пространства имен. Или посмотрите на модули и Browserify, это сэкономит вам некоторое время в долгосрочной перспективе. – elclanrs

+0

Возможно, вы пытаетесь вызвать функцию перед запуском '.ready' – Brennan

ответ

1

Проблема здесь состоит в том, что вы объявляете функцию внутри объема anaonymous функций, переданных в готовый метод JQuery.

$().ready(function() { 
    function foo(){ 
    doSomething; 
    } 
// foo can only be accessed on this scope. 
}); 

Вы можете просто выставить функцию в область окна с помощью переменной окна.

$().ready(function() { 
    window.foo = function foo(){ 
    doSomething; 
    } 
// foo can be accessed on this scope and on the gloabl app scope. 
}); 
+0

Отличное спасибо, это новый способ заявить о себе и отлично работает. –

+0

, но предлагает _no преимущество what_ever_ над просто объявлением 'foo' глобально. Он также страдает от недостатка 'window.foo', который не определяется до' $(). Ready' – Alnitak

+0

Да, это правильно. Но это ответ на его вопрос. На самом деле я не знаю, зачем ему это поведение, но это решение. – chfumero

2

Объявите это в глобальном масштабе.

var foofn; 
$().ready(function() { 
    foofn = function(){ 
    doSomething; 
    } 
}) 
+0

или - просто переместите все определение вне_ !! – Alnitak

+0

Я согласен, просто пытался научить спросить, как это ** можно вытащить, не обсуждая, если это правильный подход (я согласен, что это не в большинстве случаев). – hakazvaka

1

Вы должны определить foo, где он доступен по всему миру. Вместо function foo(){} попробуйте window.foo = function(){}.

Немного менее небрежный подход, чем приклеить кучу свойств объекта window, будет определять один глобальный объект, где вы помещаете вещи, например.

var myApp = {}; 

$(document).ready(){ 
    myApp.foo = function(){ doSomething; } 
} 

Таким образом, сценарии, которые выполняются позже на той же странице будет иметь доступ к myApp.foo.

+1

Это не скрипты «позже на той же странице», это скрипты, называемые _after DOM ready event_. Все вызовы между ними будут терпеть неудачу, потому что 'myApp.foo' будет' undefined'. – Alnitak

1

Если (и это большое если) foo должно быть вызвано в глобальном масштабе, то просто объявить его в глобальном масштабе - нет никакого смысла скрывать это прочь, как внутренняя функцию $().ready, если это не там, где он будет использоваться ,

Если вы хотите, чтобы избежать глобального загрязнения окружающей среды, обернуть все это в Сразу запущенной функции Expression:

(function() { 

    // called when all resources are loaded 
    window.onload = function foo() { 
     ... 
    }; 

    // called when the DOM is ready 
    $().ready(function() { 
     ... 
    }); 

})(); // invoke now 
Смежные вопросы