我想知道是否可以将实例方法传递给Array.prototype.map函数。
例如,我基本上想要这个功能,而不必单独创建一个函数
bindParam

在java中
我可以做$sql = "SELECT COUNT(*) FROM `Blog` WHERE `Title`!=''";
if($tags != ""){
$sql .= " AND Tags LIKE :tags";
}
$r = $db->prepare($sql);
$tags_like = "%$tags%";
$r->bindParam(':tags', $tags_like);
。我可以做些什么来改变map参数,这样我就不必创建函数吗?
如果你不能用香草js做的话,我也愿意接受lodash的解决方案。
答案 0 :(得分:4)
我认为你不能在不创建新函数的情况下严格执行此操作,但是你可以避免binding现有函数的函数表达式和声明达到某种值。
例如,您可以使用Function.prototype.call
以Node.prototype.isBig
值调用this
。
var result = myArray.map(Function.prototype.call.bind(Node.prototype.isBig));
还有一个bind operator的提案,我认为它会允许
var result = myArray.map(::Node.prototype.isBig.call);
注意其他参数(索引和数组)将传递给isBig
方法。
function Node(n) {
this.val = n;
}
Node.prototype.isBig = function() {
return this.val > 5;
};
var myArray = [
new Node(1), new Node(2), new Node(3),
new Node(7), new Node(8), new Node(9)
];
var result = myArray.map(Function.prototype.call.bind(Node.prototype.isBig));
document.write(JSON.stringify(result));

在ES6中,您可以考虑使用arrow functions:
var result = myArray.map(node => node.isBig());
答案 1 :(得分:1)
您必须创建一个以节点作为参数的函数(也就是说,它不依赖于this
Node.isBig = function(node) {
return node.isBig();
};
//works because function doesn't depend on this
myArray.map(Node.isBig);
// doesn't work, depends on this
myArray.map(Node.prototype.isBig);
或者,您可以创建一个函数,该函数返回另一个带有第一个参数的函数,并将其称为this
function passFirstArgAsThis (fun) {
return function() {
fun.apply(arguments[0], arguments);
}
}
myArray.map( passFirstArgAsThis(Node.prototype.isBig));
稍微更加神秘的实现
function passFirstArgAsThis(fn) {
return function() {
return fn.call.apply(fn, arguments);
};
}
ES6中的等效内容更具可读性
function passFirstArgAsThis(fn) {
return function() {
// arguments[0] will be the first argument passed to call
// map will pass it as the node, we will make it become `this`
// when calling the passed in function
return fn.call(...arguments);
};
}
了解这一点,Oriol's answer变得更容易理解
function passFirstArgAsThis(fn) {
// we return a bound function that will execute the call method, bound
// to the same passed in function
return fn.call.bind(fn);
// Same as
// return function() {
// return fn.call(...arguments);
// }
}
就个人而言,我会使用胖箭头函数来提高可读性,而不需要额外的“静态”函数。
nodes.map(n=>n.isBig())