我有:
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"
在控制台中。
答案 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;
}
forEach
& some
(我使用的那个)接受thisArg
参数。some
,则一旦回调返回true,迭代就会停止。在有许多密钥的情况下,这种方法更有效,并且更准确地匹配原始代码尝试执行的操作。在杰克的版本中,如果密钥位于['a', 'b', 'aa']
,您将迭代所有3,并返回' aa',而您的代码(和我的)在第一个&之后停止#39;一个'