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

时间:2016-01-07 20:44:30

标签: javascript

我正在尝试将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/

不确定我正在做什么,会感激任何输入。谢谢你的阅读!

2 个答案:

答案 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值和参数调用该函数,您可以使用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

答案 1 :(得分:0)

这里似乎不需要使用bind,因为并没有真正使用thisArg。 Lodash提供了一个名为partial的不同函数,它可以完成你想要做的事情,虽然称为partial。

我将代码的最后一行更改为:

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

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