事件处理程序中的javascript全局变量

时间:2017-02-19 09:49:47

标签: javascript jquery html css

我正在尝试在touchmove函数内请求一个全局声明的变量,但是我收到了一个引用错误。有人知道什么是错的吗?

function drawer(pulltab,drawer){
    $('#pulltab').on('touchstart',function(e){
        notworking=e.originalEvent.touches[0].pageX;
    })

    $(drawer).on('touchmove',function(loc){
        var fingerloc=loc.originalEvent.touches[0].pageX;
        var dist=fingerloc-notworking;
        console.log(dist);
        if (dist<0){
            $(this).css('margin-left',dist);
        }
    })

    $(drawer).on('touchend',function(){
        $(this).css('transition','margin-left .1s');
        $(this).css('margin-left',0);
    })
}
drawer('#pulltab','#navigation-drawer');

1 个答案:

答案 0 :(得分:2)

  

我试图在touchmove函数

中请求一个全局声明的变量

引用的代码中没有全局变量声明。

假设您尚未声明它,那么您在<{1}}上的touchstart处理程序中创建(但未声明)全局变量:

#pulltab

使用The Horror of Implicit Globals *来创建全局。但是,直到该代码运行,全球才会存在。

显然,notworking=e.originalEvent.touches[0].pageX; 上的touchmove处理程序在drawertouchstart处理程序之前触发了。由于没有现有的全局名为#pulltab,因此您无法读取其值,并获得notworking。如果ReferenceError上的touchstart已经先执行,那么您就不会。

不要依赖隐式全局变量的恐怖。声明你的变量。如果您希望它是全球性的,请填写

#pulltab

......在所有功能之外。 (尽管全局变量最好避免使用Bad Thing™;如果您只在var notworking; 函数中使用notworking,并且在调用drawer之间不需要它,则只需声明它在drawer内。)您可能还想在使用它时检查它是否具有有用的值。

* (这是我贫穷的小博客上的帖子)