почему этот объект jQuery не определен?

#jquery #html

#jquery #HTML

Вопрос:

 $(function () {
            var mainimagepanel = $("#blah1");
            var postimagepanel = $("#blah2");
   });
  

оба объекта существуют на странице, где я запускаю свой $. может кто-нибудь показать мне, почему я получил исключение, mainimagepanel не определен

исключение, вызванное Firebug или Chrome dev tool. итак, кто-нибудь может сказать мне причину и как я могу проверить, существует ли элемент управления вводом для обоих.

Комментарии:

1. Я предполагаю, что здесь есть еще код, который вы не показываете. На что вы ссылаетесь mainimagepanel позже?

2. Вы пытаетесь получить доступ к этим переменным вне этой функции?

3. нет, я просто использую Chrome dev tool и firebug, и оба выдают мне исключение, которое не определено. если я передам var mainimagepanel = $(«#blah1»);mainimagepanel, тогда он покажет мне правильные вещи.

Ответ №1:

Ваши переменные объявлены внутри анонимной функции, и это их область видимости. Они не существуют вне этой функции. Чтобы исправить это, вы можете сделать что-то вроде:

 var mainimagepanel, postimagepanel;

$(function () {
  mainimagepanel = $("#blah1");
  postimagepanel = $("#blah2");
});
  

Однако обычно рекомендуется ограничить ваши переменные так, чтобы они существовали в максимально ограниченном объеме.

Комментарии:

1. sje397 абсолютно прав и в том, что это исправит проблему, и в том, что это плохая идея. Бегло взгляните на мой ответ, чтобы лучше понять, почему.

Ответ №2:

Вот мое предположение. Я попытаюсь углубиться немного дальше, чем в других ответах. У вас есть это:

 $(function()
{
    var mainimagepanel = $('#blah1');
    var postimagepanel = $('#blah2');
});

// ... bunch of code ...

mainimagepanel.show(); // oh no!
  

Вы только что столкнулись с чем-то, называемым scoping. В частности, вы столкнулись с чем-то, называемым областью действия.

Давайте проведем пару экспериментов.

 var a = 'hello';

var myfunc = function()
{
    alert(a);
    var b = 'goodbye';
    alert(b);
};

alert(a); // pops 'hello'. good, we expected that.
myfunc(); // pops 'hello', then 'goodbye'. good, that seems right too.
alert(b); // error. because b was declared inside of myfunc, it doesn't exist out here.

var myfunc2 = function()
{
    a = 'greetings';
};

myfunc2();
alert(a); // pops 'greetings'. because myfunc2 is inside of our main code here, it can see the a out here.

var myfunc3 = function()
{
    var a = 'salutations';
    alert(a);
};

myfunc3(); // pops 'salutations'. that seems reasonable, that's what we just set it to.
alert(a);  // pops 'greetings'. huh? turns out, because we var'd the a this time, it made a *new* a inside of myfunc3, and when you start talking about a, it assumes you want that one.
  

Надеюсь, это прояснит ситуацию. Короче говоря, вы хотите сделать это вместо:

 $(function()
{
    var mainimagepanel = $('#blah1');
    var postimagepanel = $('#blah2');

    // ... put your code here ...
});

// ... instead of here! ...