我正在尝试将var绑定到某些函数中,以便我可以在内部函数中访问它。
function checkIfIsFilter(currentfilters, parentSearch) {
for (var group of currentfilters) {
if (_.find(group.filters, {"search": parentSearch})) {
return group.parentSearch || group.name;
}
}
};
function checkIfSubtopic(currentfilters, memo, value, key) {
if (value.parentSearch) {
value.subtopicOf = checkIfIsFilter(value.parentSearch).bind(null, currentfilters);
}
memo[key] = value
return memo;
}
console.log(_.reduce(currentfilters, checkIfSubtopic.bind(null, currentfilters), {}));
这似乎打破了这些功能,特别是在value.subtopicOf =
部分,其中包含无法读取属性的错误消息' bind'未定义的。我只想将currentfilters
带入内部函数中,以便我可以引用它。当我把它作为一个全局变量时可以正常工作(可以直接在currentfilters
函数内部引用checkIfIsFilter
),但是我无法在生产中使用它。
我有一个小提琴,我一直在工作:https://jsfiddle.net/0fttkyey/79/
不确定我正在做什么,会感激任何输入。谢谢你的阅读!
答案 0 :(得分:1)
让我们缩短一点
function checkIfIsFilter(currentfilters, parentSearch) {
return group.parentSearch || group.name;
}
function checkIfSubtopic(currentfilters, memo, value, key) {
value.subtopicOf = checkIfIsFilter(value.parentSearch).bind(null, currentfilters);
}
console.log(_.reduce(currentfilters, checkIfSubtopic.bind(null, currentfilters), {}));
请注意,checkIfIsFilter
不会返回某个功能,而您正在执行
checkIfIsFilter(value.parentSearch).bind();
您正在调用checkIfIsFilter
,其返回group.parentSearch
(或name
),返回值是您尝试绑定的内容?
首先,如果您想使用this
值和参数调用该函数,您可以使用call
,apply
或者在您的情况下,只需直接调用它,就像this
值似乎并不重要。
其次,您似乎尝试使用动态属性名称,该名称仅适用于括号表示法
function checkIfIsFilter(currentfilters, parentSearch) {
for (var group of currentfilters) {
if (_.find(group.filters, {"search": parentSearch})) {
return group[parentSearch] || group.name;
}
}
};
function checkIfSubtopic(currentfilters, memo, value, key) {
if (value.parentSearch) {
value.subtopicOf = checkIfIsFilter(value.parentSearch, currentfilters);
}
memo[key] = value
return memo;
}
console.log(_.reduce(currentfilters, checkIfSubtopic.bind(null, currentfilters), {}));
答案 1 :(得分:0)
这里似乎不需要使用bind,因为并没有真正使用thisArg。 Lodash提供了一个名为partial的不同函数,它可以完成你想要做的事情,虽然称为partial。
我将代码的最后一行更改为:
console.log(_.reduce(currentfilters, _.partial(checkIfSubtopic, currentfilters)));