2014-03-05 266 views
0

请看看http://jsbin.com/nubeb/1/edit的JavaScript处理程序移除事件,

(function(){ 
    var func = function(e){ 
    console.log("mouse move"); 
    document.removeEventListener("mousemove",func); 
    }; 
    document.addEventListener("mousemove",func); 
    console.log("working"); 
}()); 

我想知道的是,是否有可能从

document.removeEventListener("mousemove",func); 

替换“功能”到其他一些关键词,我想把它写类似下面的代码

(function(){ 
    document.addEventListener("mousemove",function(e){ 
    document.removeEventListener("mousemove",***); 
    }); 
}()); 

回答

2

我们有2个不同的选项,这里的第一个是使用arguments.callee它会在不久的将来被弃用,使用arguments.callee我们已经获得的正在执行的当前功能,所以你可以做这样的事情:

(function(){ 
    document.addEventListener("mousemove",function mylistener(e){ 
     document.removeEventListener("mousemove", arguments.callee); 
    }); 
}()); 

警告:ECMAScript中(ES5)的第五版禁止使用 arguments.callee的()严格模式。

阅读更多信息:arguments.callee

正如你看到的,比在不久的将来得到过时等,不能使用arguments.callee,在strict mode它可以给我们带来一些麻烦。

我们有一个新的选择,它可以帮助我们不使用arguments.callee。好吧,让我们说我们有这样的函数:

var myfunc = function yourfunc(){ 
    //yourfunc is accessible 
}; 
//but here yourfunc is not accessible 

在这段代码中,我们只能在函数体中,但出此背景下,我们只有myfunc使用​​。这听起来像我们有一个私人指针在可访问的功能范围内,可以使用,而不是arguments.callee

因此,这是新的替代可以在strict mode也使用,所以在你的代码,你可以做到这一点,如:

(function(){ 
    document.addEventListener("mousemove",function mylistener(e){ 
     document.removeEventListener("mousemove", mylistener); 
    }); 
}());