Javascript数组过滤器:获取正确的上下文

Javascript数组过滤器:获取正确的上下文,javascript,functional-programming,Javascript,Functional Programming,在尝试编写一些很棒的JS时,我遇到了一些奇怪的JS行为。我创建了一段代码来演示我的问题: $(函数(){ var images=$('.images').children(); var filtered=images.filter(函数(i,图像){ console.log(this); }“abc”); }); 结果1 结果2 结果3 结果4 结果5 结果6 结果7 结果8 结果9 结果10 结果11 结果12 结果13 结果14 结果15 好的,现在我的问题。使用Array.fil

在尝试编写一些很棒的JS时,我遇到了一些奇怪的JS行为。我创建了一段代码来演示我的问题:


$(函数(){
var images=$('.images').children();
var filtered=images.filter(函数(i,图像){
console.log(this);
}“abc”);
});
    结果1
  • 结果2
  • 结果3
  • 结果4
  • 结果5
  • 结果6
  • 结果7
  • 结果8
  • 结果9
  • 结果10
  • 结果11
  • 结果12
  • 结果13
  • 结果14
  • 结果15
好的,现在我的问题。使用Array.filter方法时,将回调函数作为第一个参数传入,并将可选上下文作为第二个参数传入。如你们所见,我将“abc”作为上下文传递(当然,这是荒谬的)。我希望我的控制台会抛出很多“abc”,但它会打印jQuery元素

有人能照一下这个吗

谢谢

马蒂恩

如你们所见,我将“abc”作为上下文传递(当然,这是荒谬的)。我希望我的控制台会抛出很多“abc”,但它会打印jQuery元素

您使用的是没有上下文参数的,而不是ES5,因为您正在对jQuery对象调用
filter
,而jQuery对象不是数组(尽管它们提供了许多类似数组的功能,以及一些具有类似名称的“方法”-包括
filter

你有三个选择:

makeArray
可以使用jQuery将jQuery对象转换为数组,例如:

$(function() {
  var images = $.makeArray($('.images').children());
  var filtered = images.filter(function(i, image) {
    console.log(this);
  }, "abc");
});

代理
/
绑定
或者,您也可以使用jQuery的函数(或ES5)来绑定要传递给jQuery的
过滤器的迭代器函数,这样它就会忽略
这个
jQuery提供:

$(function() {
  var images = $('.images').children();
  var filtered = images.filter($.proxy(function(i, image) {
    console.log(this);
  }, "abc"));
});
对jQuery对象应用
Array#filter
您可以将
数组#过滤器
直接应用于jQuery对象:

$(function() {
  var images = $('.images').children();
  var filtered = Array.prototype.filter.call(images, function(i, image) {
    console.log(this);
  }, "abc");
});

…因为
Array#filter
被明确定义为可以处理任何类似数组的内容,而不仅仅是
Array
s。最后一种可能实际上是最有效的方法

您没有使用Javascript
Array.filter()
,您使用的是jQuery的啊废话,谢谢。。我已经多次遇到同样的问题(使用jQuery方法而不是普通的老javascript方法)>@MartijnDwars:LOL不用担心,很高兴这有帮助。我为您添加了另外两个选项,最后一个选项可以避免创建不必要的临时对象。感谢您的详细解释!熟悉JS&jQuery真的很有帮助。@MartijnDwars:不客气!如果您有兴趣了解更多关于JS的信息。
$(function() {
  var images = $('.images').children();
  var filtered = Array.prototype.filter.call(images, function(i, image) {
    console.log(this);
  }, "abc");
});