Metoda zwróci funkcję, która została przekazana jako pierwszy argument związany jako wartość this
.
Od dzwonisz .bind()
z .test()
, dostajesz metodę .test()
z this
związany new RegExp(key, 'g')
.
W tym przypadku oznaczenie /./
jest nieistotne. To tylko krótki sposób na uzyskanie metody RegExp.prototype.test
.
Rezultatem jest to, że będziesz efektywnie robić:
var regexp = new RegExp(key, 'g');
filterArray.filter(function(val) {
return regexp.test(val);
});
Należy pamiętać, że jest to trochę niebezpieczne, ponieważ obiekt regex z modyfikatorem g
jest stanowe. Oznacza to, że zawsze rozpoczyna nowe wyszukiwanie, w którym poprzednie zostało przerwane.
Biorąc pod uwagę ten scenariusz filtrowania, g
nie wydaje się być konieczne i może tylko powodować problemy.
Oto przykład o niebezpieczeństwie za pomocą g
tutaj:
var re = /./.test.bind(new RegExp("foo", 'g'));
var str = "foobar";
console.log(re(str)); // true
console.log(re(str)); // false
Więc wywołanie samego regex na ten sam ciąg produkuje dwa różne wyniki. Gdybyśmy zadzwonili ponownie, znów byłoby true
.
Więc biorąc pod uwagę zastosowanie jako .filter()
zwrotnego, powiedzmy key
jest "foo"
, to powiedzmy, że jeden val
jest "foobar"
. Będzie dozwolone przez filtr.
Ale powiedzmy, że następny val
to "foobaz"
. Wyszukiwanie zostanie wznowione na czwartym znaku, zamiast zaczynać od pierwszego, więc "foo"
nie zostanie znaleziony.
Oto konkretny przykład, który pokazuje problem w działaniu:
DEMO:http://jsfiddle.net/s9PzL/
var filterArray = [
"foobar",
"foobaz",
"foobuz",
"foobix"
];
var result = filterArray.filter(/./.test.bind(new RegExp("foo", 'g')));
Wszystkie struny mają "foo"
, więc wszyscy powinni dotrzeć. Ale wynik pokazuje, że tak się nie dzieje.
document.body.textContent = result.join(", "); // foobar, foobuz
Jeśli dasz nam zmienną 'key' to tak. –
@DavidStarkey Proszę zobaczyć moją edycję. – ptf
Zobacz https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind –