编程语言
首页 > 编程语言> > javascript-返回时函数变得不确定

javascript-返回时函数变得不确定

作者:互联网

我有:

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

当我用函数的键调用get()时,我希望check()返回true;但是,它返回false.我在get()中执行字典查找,并在两个函数中打印结果的类型.这是奇怪的部分.该类型仅在get()中是函数;在check()中,它是未定义的.显然,当我返回该函数时,该函数将被擦除.如何使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"

在控制台中.

解决方法:

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

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

标签:closures,undefined,javascript,function
来源: https://codeday.me/bug/20191119/2039998.html