回调函数无法访问父函数范围内的变量

时间:2018-07-29 14:34:11

标签: javascript

在下面的代码中,text函数中无法访问变量findTextToDelete(它会产生错误)

array = ['a', 'b', 'removeThis', 'c'];
removeText("removeThis");

function removeText(text) {
    array.splice(array.findIndex(findTextToDelete),1);
}

function findTextToDelete(element) {
    return element === text;
}

我可以通过创建全局变量'globalText'来解决此问题:

var globalText = "";
array = ['a', 'b', 'removeThis', 'c'];
removeText("removeThis");

function removeText(text) {
    globalText = text;
    array.splice(array.findIndex(findTextToDelete),1);
}

function findTextToDelete(element) {
    return element === globalText;
}

console.log(array)

但是我试图理解为什么第一种方法不起作用。

似乎必须有更好的方法来做到这一点。有没有办法将“文本”传递给回调函数?

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

您可以在text上使用closure来查找元素。

function removeText(text) {
    array.splice(array.findIndex(findTextToDelete(text)), 1);
}

function findTextToDelete(text) {
    return function (element) {
        return element === text;
    }
}

var array = ['a', 'b', 'removeThis', 'c'];

removeText("removeThis");
console.log(array)

答案 1 :(得分:1)

是的,我认为您对closure感到困惑。

回调函数没有调用者的作用域。因此,您无法访问text中的变量findTextToDelete

如果要访问该变量,请将其作为参数传递给回调函数。

答案 2 :(得分:0)

在一个函数中定义的本地仅可用于第一个函数中定义的其他函数。函数中定义的局部变量的范围限于该函数。这通常称为https://stackoverflow.com/users/2030565/jasen。 (其他语言有不同的规则,但命令式语言中的词汇很常见。)

因此,您需要在removeText内定义一个函数才能访问text

一种方法是仅使用函数文字而不是命名函数:

function removeText(text) {
    globalText = text;
    array.splice(array.findIndex(function (element) {
        return element === globalText;
    }, 1);
}

另一种方法是转发额外的值:

function removeText(text) {
    globalText = text;
    array.splice(array.findIndex(function (el) { returnfindTextToDelete(el, text); }, 1);
}

function findTextToDelete(element, text) {
    return element === globalText;
}

(如果您不向后兼容,那么使用箭头功能可以使两者都更容易编写。)