Почему я не могу определить функции в документе jQuery document.ready ()?

Функции появляются как неопределенные, если я помещаю их в функцию document.ready ():

<code>$(document).ready(function(){
  function foo()
  {
    alert('Bar');
  }
});

foo(); // Undefined
</code>

Почему это происходит? Я уверен, что мне просто нужно некоторое простое понимание :)

Ответы на вопрос(6)

Они появятся как неопределенные, если вы поместите их в любую область, не принадлежащую им. Если вы действительно хотите использовать их вне области действия $ (document) .ready (...), вам нужно объявить их внешне. Такие как:

var foo;

$(document).ready(function(){
  foo = function()
  {
    alert('Bar');
  }
});

foo(); // works now because it is in scope

Надеюсь это поможет.

 21 окт. 2014 г., 15:06
Почему тогда работает решение Hari Om?
 23 мар. 2016 г., 15:52
Потому что myfnc на самом деле не является именем функции. Хари Ом создает анонимную функцию и присваивает ее переменной myfnc. Поскольку переменная myfnc является глобальной (переменные в JScript имеют глобальную область видимости, если она не объявлена с помощью «var»), она видна за пределами области действия ready (). Увидетьstackoverflow.com/questions/1013385/… для объяснения разницы между объявлением функции и выражением функции
 03 дек. 2015 г., 06:26
даmyfnc() вызов есть, но как насчетmyfnc(param1, param2) во входном событии onclick?
 02 дек. 2015 г., 09:31
Решение @jj_ Hari Om работает, потому что вызов myfnc находится в той же области, в которой объявлен myfnc.

Вы можете, но они должны быть вызваны в рамкахready() метод в противном случае они теряют прицел, когдаready() метод выхода.

Например, код ниже будет работать:

$(document).ready(function(){
  function foo()
  {
    alert('Bar');
  }

  foo(); // still in the scope of the ready method
});
 James Skidmore28 июн. 2009 г., 23:19
@Soviut, спасибо за отличное объяснение!
 James Skidmore28 июн. 2009 г., 23:06
Есть ли способ обойти это? Изменить сферу?
 29 июн. 2009 г., 00:09
@James, было бы НЕ лучше с точки зрения кода, подумайте о вашей функции foo () как о библиотеке или API, если ее нужно вызывать изнутри и снаружи готовой области. В этом случае вы заставляете его принимать все необходимые аргументы и выкладываете результат, никаких побочных эффектов.
 James Skidmore28 июн. 2009 г., 23:18
@ Оли, было бы лучше с точки зрения организации кода иметь возможность объявить его в рамках .ready ().
 28 июн. 2009 г., 23:10
Просто. Определите их вне области .ready (...). Я не понимаю, почему вы так привязаны к этому. Какую пользу это может вам предложить?
Решение Вопроса

Не уверен, почему определение функции в объемеready() важно для вас, но вы можете заставить его работать, объявивfoo впереди:

<html><head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js"></script>
<script>
var foo;                           // Here's the difference
$(document).ready(function(){
  foo = function ()
  {
    alert('Bar');
  }
});
</script></head><body>
<input type="button" onclick="foo()" value="Click me">
</body></html>

Очевидно, что вы не можете позвонитьfoo() из встроенного скрипта сразу послеready() посколькуready() код еще не запущен, но вы можете вызвать функцию позже.

Просто убедитесь, что ничто не может попытаться позвонитьfoo() передready() код выполняется (или сделать первоначальное объявлениеfoo() безвредная функция).

 James Skidmore28 июн. 2009 г., 23:17
Отличная идея. Спасибо, Ричи!
 12 авг. 2014 г., 14:44
@RichieHindle также, если вы НЕ добавляетеvar foo и оставьте объявление функции, как вы отправилиfoo = function (){}переменнаяfoo будет назначена глобальная область видимости. Вы можете просто проверить это, выполнивconsole.log(window.foo); после того, как функция была загружена.
 23 февр. 2012 г., 00:41
Что делать, если вам нужно позвонитьfoo() с какими параметрами? Как бы вы их передали и как бы их приняли?
 23 февр. 2012 г., 18:24
@ alonso.torres: как и любая другая функция JavaScript:foo = function(x, y, z) {...} ... onclick="foo(1, 2, 3)"
 12 авг. 2014 г., 14:41
@RichieHindle, обратите внимание, что «способ объявления функции» вопросы, см.stackoverflow.com/questions/11819425/…

Просто еще одно дополнение:

При объявлении функций или переменных внутри$(document).ready() функция, они недоступны при использованииonclick() связывает в документе.

Вы можете переместить свои декларации за пределы$(document).ready()или вы можете использовать$('#element').on('click', function() {}) внутри `$ (document) .ready ().

<script>
    $(document).ready(function(){
      myfnc = function (param1, param2)
      {
        alert('Hello');
      }
      myfnc();
    });
</script>
<input type="button" onclick="myfnc('arg1', 'arg2')" value="Click me">

Ваша функция определена в рамках$(document).ready() Обратный звонок и не может бытьseen отoutside, Либо определите функцию вне$(document).ready() Объем звонка это только изнутри.

Ваш ответ на вопрос