错误var未定义 - 但在使用之前已定义 -

时间:2011-10-13 15:07:26

标签: javascript function variables document-ready

此代码

    $(document).ready(function(){
                            var wBack = $('ul li.roundabout-in-focus').height();
                            var hBack = $('ul li.roundabout-in-focus').width();
                            var lback = $('ul li.roundabout-in-focus').css('left');
                            var tback = $('ul li.roundabout-in-focus').css('top');
    });
    function close_current(){
                    $('.nInfoIE').show();
                        $('.roundabout-in-focus').find('.img').show();
                        $('.roundabout-in-focus').css({position:'absolute',height:hBack,width:wBack,left:lBack,top:tBack});
                        $('.roundabout-in-focus').find('.iframe').css({'visibility':'hidden'});
                        $('ul li').find('.iframe').addClass('esconder');

                        $('ul li iframe').each(function(){
                            var tempurl = '';
                            tempurl = $(this).attr('src');
                            $(this).attr('src',tempurl.replace('?autoplay=1', ''));
                        });
                        watching = false;
                        $('.nInfoIE').hide();
 }

通过firebug警告未定义hBack来提示错误,正如您所看到的那样是在document.ready上定义的,并且该函数在onClick元素上执行...

-edit -

甚至尝试在document.ready之前添加var wBack ,hBack,lback,tback = 0;并删除document.ready中的单个'var'。

我错过了什么?

5 个答案:

答案 0 :(得分:4)

您已经在处理函数中定义了 变量。这意味着他们对该功能是私有的,并且在其外部不可见。

您可以通过明确地将它们设为window属性来使它们可见:

  window['hBack'] = whatever;

或者您也可以将“closeCurrent”函数放在“ready”处理程序中,只要它只由处理程序中的代码引用即可。

答案 1 :(得分:3)

总之,范围。在$(document).ready函数之外声明变量以使它们进入全局范围,然后在函数内部设置它们。

var wBack, hBack, lback, tback;
$(document).ready(function () {
    wBack = ...

答案 2 :(得分:2)

这是一个范围问题。

此处的其他答案在技术上可行,但如果您不需要全局,我绝不建议将这些变量保持全局。

您正在DOM-ready块中定义wBackhBacklBacktBack,但您正尝试从事件处理程序访问它们。如果可以,请从元素中删除onclick,并将其添加到DOM-ready块中以共享变量。

$(document).ready(function(){

    // Store the selector
    var element = $('ul li.roundabout-in-focus')
    var wBack = element.height();
    var hBack = element.width();
    var lback = element.css('left');
    var tback = element.css('top');

   $("#someElement").click(function close_current(){
                    $('.nInfoIE').show();
                        $('.roundabout-in-focus').find('.img').show();
                        $('.roundabout-in-focus').css({position:'absolute',height:hBack,width:wBack,left:lBack,top:tBack});
                        $('.roundabout-in-focus').find('.iframe').css({'visibility':'hidden'});
                        $('ul li').find('.iframe').addClass('esconder');

                        $('ul li iframe').each(function(){
                            var tempurl = '';
                            tempurl = $(this).attr('src');
                            $(this).attr('src',tempurl.replace('?autoplay=1', ''));
                        });
                        watching = false;
                        $('.nInfoIE').hide();
   })
});

你还应该将选择器缓存在该块的顶部(如我的例子中),以防止重复查询DOM(你也可以在点击处理程序中执行此操作,但选择器是不同的,所以我离开了单独的功能:)

希望有所帮助!欢呼声。

答案 3 :(得分:0)

该变量仅在您传递给ready函数的函数范围内定义。如果要引用它,则需要在全局范围内声明它。 (只需删除var关键字)

答案 4 :(得分:0)

您的变量(wBack,hBack,lback和tback)只是在document.ready函数中定义的。没有全球性的。

为了能够在您的其他功能中使用它,您的变量必须是全局的。 您可以在变量之前删除'var',因为在javascript中,没有'var'的变量声明使变量成为全局变量。或者您可以手动将其声明为全局:

var wBack;      
var hBack;
var lback;
var tback;
$(document).ready(function(){
   wBack = $('ul li.roundabout-in-focus').height();
   hBack = $('ul li.roundabout-in-focus').width();
   lback = $('ul li.roundabout-in-focus').css('left');
   tback = $('ul li.roundabout-in-focus').css('top');
});