无法读取属性'绑定'绑定2个函数时未定义的

Cannot read property 'bind' of undefined when binding 2 functions

本文关键字:绑定 未定义 函数 2个 读取 属性      更新时间:2023-09-26

我正在尝试将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 =部分,错误消息为Cannot read property'bind'of undefined。我只想把currentfilters引入最内部的函数中,这样我就可以引用它。当我把它作为全局变量时(可以直接在checkIfIsFilter函数内部引用currentfilters),这很好,但我不能在生产中使用它。

我有一把我一直在工作的小提琴:https://jsfiddle.net/0fttkyey/79/

不确定我做的是正确的,如果有任何意见,我将不胜感激。感谢阅读!

让我们缩短一点

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值和参数调用函数,您可以只使用callapply,或者在您的情况下,直接调用它,因为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), {}));

FIDDLE

这里似乎不需要使用bind,因为thisArg并没有真正被使用。Lodash提供了一个名为partial的不同函数,它可以准确地执行您想要执行的操作,尽管它被称为partial。

我把你代码的最后一行改成了这个:

console.log(_.reduce(currentfilters, _.partial(checkIfSubtopic, currentfilters)));

此处的示例:https://jsfiddle.net/yqt8y0hb/