是否可以知道函数是否使用空的return语句而不是使用return关键字?
例如:
function noReturn(){ }
function useReturn(){ return; }
console.log( noReturn() ); // undefined
console.log( useReturn() ); // undefined
我知道所有关于WHEN和WHY的人会使用空的return语句,我只是想知道你是否可以判断return;
是否被使用而不是返回语句。
我假设它不可能,那没关系。如果有任何很酷的函数原型技巧我不知道,那就太好了。
<小时/> 编辑:不试图解决任何特定问题,除非一般好奇心是一个问题。 :)
答案 0 :(得分:2)
您无法区分这三个函数的返回值:
function a() { }
function b() { return; }
function c() { return undefined; }
根据JS规范。
答案 1 :(得分:1)
我认为这是一个玩具问题,但这是一个可能的方法来解决这个问题。将函数转换为字符串,然后对于字符串中任何位置的有效return语句的所有实例,将其替换为confederate return语句。使用eval()
执行此修改后的函数,并观察返回的内容。
例如,
function foo(){ return; }
function bar(){ if(0) return; }
变为
function foo(){ return 'return;'; } // "return;"
function bar(){ if(0) return 'return'; } // undefined
这样,无论逻辑在函数中遵循什么路径,如果显式返回某些,我们就可以知道它采用何种形式。如果由于设计或逻辑流程没有返回任何内容,那么&#39; undefined&#39;退回。考虑以下功能:
function inspectReturn(fcn) {
var str = fcn.toString();
// Anytime we see a 'return something' we replace it with return 'something'
str = str.replace(/(\b)return \s*(\S[^\n;}]+)/mg, "$1return '$2'");
// Anywhere we see a lone 'return' we replace it with return 'return'
str = str.replace(/(\b)return\s*([\n;}])/mg, "$1return 'return;'$2");
eval("fcn="+str);
return fcn();
}
然后我们可以观察以下示例函数的返回值:
function noReturn(){ } // undefined
function useReturn(){ return } // "return;"
function useReturn2(){ return; } // "return;"
function useReturn3(){ return true; } // "true"
function useReturn4(){ if(0) return; } // undefined
function useReturn5(){ return undefined } // "undefined "
function useReturn6(){ var _return = " return "; return _return; } // "_return"
演示: JSBin
注意:表达您对如何根据需要改进正则表达式的看法。你可能能够打破它(并祝贺你),但是简单而具体的JavaScript解析规则,用于验证return statements,所以在这样的玩具问题上,它已经出现了让读者正确实施它们。此外,如果某些内容为thrown
,则存在catch
块。但是,这是一个足够的演示恕我直言。
答案 2 :(得分:1)
不,不可能区分这些:
return undefined;
return;
首先,return undefined;
和return;
都返回相同的内容:
ReturnStatement :
return
;
return
[no LineTerminator 此处] 表达式;
return
语句导致函数停止执行并返回a 对来电者的价值。如果省略 Expression ,则返回值为 的未定义即可。否则,返回值是 Expression 的值。ReturnStatement 评估如下:
- 如果 Expression 不存在,请返回(返回,未定义,为空)。
- 让 exprRef 成为评估 Expression 的结果。
- 返回(返回,GetValue( exprRef ),为空)。
醇>
然后,如果您使用return;
或没有任何内容,则无关紧要,因为[[Call]]
将返回undefined
:
- 如果结果 .type throw ,则抛出结果 .value。
- 如果结果 .type return ,则返回结果 .value。
- 否则结果 .type必须正常。返回未定义。
醇>
答案 3 :(得分:0)
除了知道JavaScript没有区分这些。检查的方法可能是:
function noReturn(){ }
function useReturn(){ return; }
function foo(){
var _return = "return";
}
function fooReturn(){
var _return = "return";
return _return;
}
function fooReturn2(){
var _return = "return";
return;
}
console.log(/return\s*(\w*);?\s*}\s*/.test(noReturn.toString())); //false
console.log(/return\s*(\w*);?\s*}\s*/.test(useReturn.toString())); //true
console.log(/return\s*(\w*);?\s*}\s*/.test(foo.toString())); //false
console.log(/return\s*(\w*);?\s*}\s*/.test(fooReturn.toString())); //true
console.log(/return\s*(\w*);?\s*}\s*/.test(fooReturn2.toString())); //true
&#13;