我想建立一个垫片。我有以下垫片,只能执行一次,并且应该将返回值提供给其他函数。这有点像http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/。
// WAY 1
matches: function(){
return Element.prototype.matchesSelector
|| Element.prototype.webkitMatchesSelector
|| Element.prototype.mozMatchesSelector
|| Element.prototype.msMatchesSelector
|| Element.prototype.oMatchesSelector
|| Element.prototype.matches
|| Element.prototype.webkitMatches
|| Element.prototype.mozMatches
|| Element.prototype.msMatches
|| Element.prototype.oMatches;
}(),
现在我想通过其他函数使用返回值:
// Uncaught TypeError: Illegal invocation (anonymous function)
if(matches('ul')){
...
}
但是我无法检索匹配的返回值,因为它是一个匿名函数。
如果我不立即执行该功能,它将起作用:
// WAY 2
matches: function(){
return Element.prototype.matchesSelector
|| Element.prototype.webkitMatchesSelector
|| Element.prototype.mozMatchesSelector
|| Element.prototype.msMatchesSelector
|| Element.prototype.oMatchesSelector
|| Element.prototype.matches
|| Element.prototype.webkitMatches
|| Element.prototype.mozMatches
|| Element.prototype.msMatches
|| Element.prototype.oMatches;
},
// Now it works, but the method is executed every time.
if(matches('ul')){
...
}
如何让“WAY 1”工作?
答案 0 :(得分:2)
你太复杂了。就这样做:
matches: Element.prototype.matchesSelector
|| Element.prototype.webkitMatchesSelector
|| Element.prototype.mozMatchesSelector
|| Element.prototype.msMatchesSelector
|| Element.prototype.oMatchesSelector
|| Element.prototype.matches
|| Element.prototype.webkitMatches
|| Element.prototype.mozMatches
|| Element.prototype.msMatches
|| Element.prototype.oMatches;
答案 1 :(得分:1)
正如您所提到的,您有一个名为DOM
的全局对象,使用它可以这样做:
matches: (DOM._getMatches = function(){
return Element.prototype.matchesSelector
|| Element.prototype.webkitMatchesSelector
|| Element.prototype.mozMatchesSelector
|| Element.prototype.msMatchesSelector
|| Element.prototype.oMatchesSelector
|| Element.prototype.matches
|| Element.prototype.webkitMatches
|| Element.prototype.mozMatches
|| Element.prototype.msMatches
|| Element.prototype.oMatches;
})(),
然后随时致电_getMatches
:
DOM._getMatches()
如果您的代码中有任何其他全局对象,则可以使用它代替DOM
。
答案 2 :(得分:0)
匿名函数是一个返回另一个函数的函数。
在第一种情况下,您调用它并将返回的函数存储在matches
上。然后你稍后调用返回的函数。
问题在于该函数的目的是将this
中存储的HTML元素与作为参数传递的选择器进行比较。
当您致电matches('ul')
时,this
的值为window
(或严格模式下为undefined
)。这不是一个HTML元素。
你需要更像的东西:
matches.apply(document.getElementById('something_that_might_be_a_list', 'ul');