有可能知道函数是否使用空返回语句?

时间:2015-06-28 00:53:45

标签: javascript

是否可以知道函数是否使用空的return语句而不是使用return关键字?

例如:

function noReturn(){ }
function useReturn(){ return; }

console.log( noReturn() );   // undefined
console.log( useReturn() );  // undefined

我知道所有关于WHEN和WHY的人会使用空的return语句,我只是想知道你是否可以判断return;是否被使用而不是返回语句。

我假设它不可能,那没关系。如果有任何很酷的函数原型技巧我不知道,那就太好了。

<小时/> 编辑:不试图解决任何特定问题,除非一般好奇心是一个问题。 :)

4 个答案:

答案 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;都返回相同的内容:

  

12.9 The return Statement

     

ReturnStatement

     
      
  • return ;
  •   
  • return [no LineTerminator 此处] 表达式 ;
  •   
     

return语句导致函数停止执行并返回a   对来电者的价值。如果省略 Expression ,则返回值为   的未定义即可。否则,返回值是 Expression 的值。

     

ReturnStatement 评估如下:

     
      
  1. 如果 Expression 不存在,请返回(返回未定义为空)。
  2.   
  3. exprRef 成为评估 Expression 的结果。
  4.   
  5. 返回(返回,GetValue( exprRef ),为空)。
  6.   

然后,如果您使用return;或没有任何内容,则无关紧要,因为[[Call]]将返回undefined

  

13.2.1 [[Call]]

     
      
  1. 如果结果 .type throw ,则抛出结果 .value。
  2.   
  3. 如果结果 .type return ,则返回结果 .value。
  4.   
  5. 否则结果 .type必须正常。返回未定义
  6.   

答案 3 :(得分:0)

除了知道JavaScript没有区分这些。检查的方法可能是:

&#13;
&#13;
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;
&#13;
&#13;