返回时函数变为未定义

时间:2015-07-31 22:28:12

标签: javascript function closures undefined

我有:

  • 字典(functions)将字符串前缀映射到函数
  • 返回映射到字符串
  • 的函数的函数(get()
  • 一个函数(check()),它通过调用get()并将其转换为带有!!的布尔值来检查是否有映射到字符串的函数。

当我使用get()中的密钥拨打functions时,我希望check()返回true;但是,它会返回false。我在get()中执行字典查找,并在两个函数中打印结果的类型。这是奇怪的部分。仅function中的类型为get();在check()中,它是undefined。显然,当我返回它时,该功能会被删除。如何使check()准确?

这是我的简化代码:

var someObject = {
    functions: {
        "a": function () { return 0; },
        "b": function () { return 1; }
    },
    get: ( function ( someVariable ) {
        Object.keys( this.functions ).forEach( ( function ( functionKey ) {
            if ( someVariable.startsWith( functionKey ) ) {
                console.log( typeof this.functions[ functionKey ] );
                return this.functions[ functionKey];
            }
        } ).bind( this ) );
    } ),
    check: function ( stringToCheck ) {
        var returnedFunction = this.get( stringToCheck );
        console.log( typeof returnedFunction );
        return !!returnedFunction;
    }
}

$( document ).ready( function () {
    someObject.check( "a" );
} );

运行此代码会产生以下结果:

"function"
"undefined"

在控制台中。

2 个答案:

答案 0 :(得分:2)

这是因为forEach不会在return语句中断开早期/短路(它继续下一次迭代,然后get函数返回{{1 }})。您可以重新编写循环以允许中断(例如,使用简单的undefined),或者您可以在循环后返回值,例如:

for-loop

答案 1 :(得分:1)

那是因为您从forEach回调中返回了该功能。它无处可去。

修复可以像杰克建议的那样工作,但代码代码可以简化:

get: function ( someVariable ) {
        var func;
        Object.keys( this.functions ).some(function ( functionKey ) {
            if ( someVariable.startsWith( functionKey ) ) {
                console.log( typeof this.functions[ functionKey ] );
                func = this.functions[ functionKey];
                return true;
            }
        }, this );
        return func;
    }
  • 你不需要用parens包装这个函数
  • 您不需要绑定forEach& some(我使用的那个)接受thisArg参数。
  • 如果使用some,则一旦回调返回true,迭代就会停止。在有许多密钥的情况下,这种方法更有效,并且更准确地匹配原始代码尝试执行的操作。在杰克的版本中,如果密钥位于['a', 'b', 'aa'],您将迭代所有3,并返回' aa',而您的代码(和我的)在第一个&之后停止#39;一个'