获取NaN作为我的JS函数的结果。谁能解释为什么?

时间:2016-11-05 15:44:54

标签: javascript function closures

我是Javascript的新手,所以请耐心等待。我写了一个函数,它返回数组中最高和最低数字之间的差异:



// FUNCTION 1
function range (arr) {
  var max = Math.max.apply(null, arr);
  var min = Math.min.apply(null, arr);
  var max_diff = max - min;
  return max_diff;
}
console.log(range([6,2,3,4,9,6,1,0,5])); // 9




然而,在我提出这个解决方案之前,我尝试了另一种方法:



// FUNCTION 2
function range (arr) {
  var max = function (arr) {
    return Math.max.apply(null, arr);
  }
  var min = function (arr) {
    return Math.min.apply(null, arr);
  }
  var max_diff = max - min;
  return max_diff;
}
console.log(range([6,2,3,4,9,6,1,0,5])); // NaN




此函数返回" NaN"。我读了NaN,但我仍然不清楚为什么我会得到NaN"结果。

另一个奇怪的事情是:如果我在FUNCTION 1之前放置FUNCTION 2,第二个函数实际上会返回正确的结果(9)。

Whaaaat?

3 个答案:

答案 0 :(得分:2)

您正在减去两个函数maxmin。因此,首先将函数强制转换为原始值,然后强制转换为数字,然后减去。

当强制转换为基元时,函数返回其代码的依赖于实现的字符串表示形式。很可能这对一个数字来说是不可强制的,所以你得到NaN,即非数字。减去NaN s会产生NaN

也许您想要运行IIFE(立即调用的函数表达式):



// FUNCTION 2
function range (arr) {
  var max = function () {
    return Math.max.apply(null, arr);
  }(); // <-- max is the value returned by calling the function
  var min = function () {
    return Math.min.apply(null, arr);
  }(); // <-- min is the value returned by calling the function
  var max_diff = max - min;
  return max_diff;
}
console.log(range([6,2,3,4,9,6,1,0,5])); // 9
&#13;
&#13;
&#13;

答案 1 :(得分:1)

你的问题是你永远不会调用这个函数,因此你的max和min变量是函数而不是数字。

您可以使用IIFE(在声明之后调用该函数)

&#13;
&#13;
// FUNCTION 2
function range (arr) {
  var max = (function (arr) { return Math.max.apply(null, arr); }(arr));
  var min = (function (arr) { return Math.min.apply(null, arr); }(arr));
  var max_diff = max - min;
  return max_diff;
}
console.log(range([6,2,3,4,9,6,1,0,5])); // NaN
&#13;
&#13;
&#13;

答案 2 :(得分:0)

你收到了NaN,因为你减去了两种方法:

isNaN(function(){} - function(){}) === true; // true

您需要调用方法并减去其结果:

function range (arr) {
  // method
  var max = function (arr) {
    return Math.max.apply(null, arr);
  }
  
  // method
  var min = function (arr) {
    return Math.min.apply(null, arr);
  }
  
  // invoke the methods
  var max_diff = max(arr) - min(arr);

  return max_diff;
}

document.write(range([1,2,3,4,5,6,7,8,9]));

BTW,因为你正在使用一个函数,所以你不需要在每次调用时都传递一个数组:

function range (arr) {
  // no need to pass arr
  var max = function () {
    return Math.max.apply(null, arr);
  }

  // no need to pass arr
  var min = function () {
    return Math.min.apply(null, arr);
  }

  // invoke the methods without passing arr
  var max_diff = max() - min();

  return max_diff;
}