JavaScript';未定义';

JavaScript';未定义';,javascript,undefined,Javascript,Undefined,有点简单。你能帮我解释一下为什么这条线 “console.log(“test”,nn)})”将nn显示为未定义,而不是值3?多谢各位。下面是代码片段 function unless(test, then) { if (!test) then(); } function repeat(times, body) { for (var i = 0; i < times; i++) body(i); } repeat(3, function(n) { var nn = unless(

有点简单。你能帮我解释一下为什么这条线 “console.log(“test”,nn)})”将nn显示为未定义,而不是值3?多谢各位。下面是代码片段

function unless(test, then) {
  if (!test) then();
}
function repeat(times, body) {
  for (var i = 0; i < times; i++) body(i);
}

repeat(3, function(n) {
  var nn = unless(n % 2, function() {
    return 1 * 3
  });
  console.log("test", nn)
});
功能,除非(然后进行测试){
如果(!test)那么();
}
功能重复(次数,身体){
对于(var i=0;i
您试图从函数
的结果中分配nn,除非
当前
除非()
返回
未定义的
,因此表达式的结果是
未定义的

回调函数
then()
中的返回不在
nn
的范围内。要捕获结果,它将返回到
的范围,除非()
没有返回语句,这意味着
var nn
将由于未返回任何内容而产生未定义的结果

为了解决这个问题,当您执行算法的递归部分时,您应该在
除非()
的范围内指定一个变量,然后返回:

function unless(test, then) {
    var result = test;
    if (!test) { 
        result = then(); 
    }
    return result;
}
function repeat(times, body) {
  for (var i = 0; i < times; i++) body(i);
}

repeat(3, function(n) {
  var nn = unless(n % 2, function() {
    return 1 * 3
  });
  console.log("test", nn)
});
功能,除非(然后进行测试){
var结果=测试;
如果(!test){
结果=然后();
}
返回结果;
}
功能重复(次数,身体){
对于(var i=0;i
现在返回
3,1,3
您的
,除非()
函数不返回任何内容。因此

var nn = unless(...);
意味着
nn
将只是
未定义的
。要使
nn
具有值,您的
除非()
函数必须返回一个值

在这里:

function unless(test, then) {
  if (!test) then();
}
没有
return
语句。回调
then()
可能会返回一个值,但如果您将该值分配给某个对象,则只会使该值在
中可用。如果希望
exceller()
本身返回值,则需要添加一个或多个适当的
return
语句

例如,只需返回
then()
值即可解决部分问题,例如:

function unless(test, then) {
  if (!test) return then();
}
但是,对于
test
为truthy的情况,仍然需要返回值。我不确定在这种情况下您希望返回值是什么,因此我不知道该推荐什么,但一般形式可能是:

function unless(test, then) {
  if (!test) {
      return then();
  } else {
      return somethingelse;   // assign some return value when `test` is truthy
  }
}

除非()
不返回任何内容。@Juhana该评论应该是答案。这个问题应该关闭而不是回答。@ZakariaAcharki没有区别。@ZakariaAcharki不适合我,适合JavaScript。您可以通过测试
(function(arg){console.log(arg==undefined)})(
)来论证“nothing”是
未定义的
——您将“nothing”传递给函数,将其与
未定义的
进行比较,并得到
true
。因此,“无”等于
未定义的
@Siguza修改了我的答案,正如你所说的“无”是真正未定义的是一个有效的观点。尽管总是最好优雅地处理
未定义的
案例,谢谢您的帮助。我很感激。这很有帮助