这个JavaScript程序采取了哪些步骤

这个JavaScript程序采取了哪些步骤,javascript,Javascript,有人能解释一下这个程序所采取的步骤以及产生“假”结果的顺序吗 当调用函数negate时,它会在传递给它的函数周围创建一个闭包。因此,当您调用isNotNaN时,它实际上正在运行isNaN,该函数已包含在函数中,然后使用布尔not运算符“!”对其求反 调用函数negate时,它会在传递给它的函数周围创建一个闭包。因此,当您调用isNotNaN时,它实际上正在运行isNaN,该函数已包含在函数中,然后使用布尔not运算符“!”对其求反 定义negate()函数 将变量isNotNaN设置为返回否定(

有人能解释一下这个程序所采取的步骤以及产生“假”结果的顺序吗


当调用函数negate时,它会在传递给它的函数周围创建一个闭包。因此,当您调用isNotNaN时,它实际上正在运行isNaN,该函数已包含在函数中,然后使用布尔not运算符“!”对其求反

调用函数negate时,它会在传递给它的函数周围创建一个闭包。因此,当您调用isNotNaN时,它实际上正在运行isNaN,该函数已包含在函数中,然后使用布尔not运算符“!”对其求反

  • 定义
    negate()
    函数
  • 将变量
    isNotNaN
    设置为返回
    否定(isNaN)
  • negate()
    返回一个函数,同时保持作用域为
    func
    (在本例中为
    isNaN
  • 使用
    isNotNan(NaN)
    调用
    show()。与
    (!isNaN(NaN))
    相同
  • 定义
    negate()
    函数
  • 将变量
    isNotNaN
    设置为返回
    否定(isNaN)
  • negate()
    返回一个函数,同时保持作用域为
    func
    (在本例中为
    isNaN
  • 使用
    isNotNan(NaN)
    调用
    show()。与
    (!isNaN(NaN))
    相同
  • 最终的结果是,您有一个返回与
    isNaN
    函数相反的函数

    如果你能用
    直接调用
    isNaN
    ,那就太过分了你自己

    show( !isNaN(NaN) );  // gives the same result
    
    最终的结果是,您有一个返回与
    isNaN
    函数相反的函数

    如果你能用
    直接调用
    isNaN
    ,那就太过分了你自己

    show( !isNaN(NaN) );  // gives the same result
    

    该代码定义了一个函数“否定”,该函数将另一个函数作为参数。“negate”函数本身返回另一个函数,该函数返回的布尔值与调用传入参数的参数函数的结果相反


    然后,代码定义了一个变量“isNotNan”,并将其设置为使用一个名为“isNaN”的函数(我们在这里没有看到)调用“negate”的结果。使用常量
    NaN
    调用该函数实际上与调用
    相同!isNaN(NaN)
    ,它是
    false
    ,因为
    NaN
    NaN
    ,代码定义了一个函数“negate”,将另一个函数作为参数。“negate”函数本身返回另一个函数,该函数返回的布尔值与调用传入参数的参数函数的结果相反

    function negate(func) {
      return function(x) {
        return !func(x);
      };
    }
    var isNotNaN = negate(isNaN);
    show(isNotNaN(NaN));
    
    然后,代码定义了一个变量“isNotNan”,并将其设置为使用一个名为“isNaN”的函数(我们在这里没有看到)调用“negate”的结果。使用常量
    NaN
    调用该函数实际上与调用
    相同!isNaN(NaN)
    ,它是
    false
    ,因为
    NaN
    NaN

    function negate(func) {
      return function(x) {
        return !func(x);
      };
    }
    var isNotNaN = negate(isNaN);
    show(isNotNaN(NaN));
    
    让我们从顶部开始:

    function negate( func )
    {
      ...
    }
    
    使用参数
    func
    声明函数
    negate
    。该函数返回一个匿名函数:

    function(x)
    {
      return !func(x);
    }
    
    匿名函数将执行原始函数的
    func
    参数中提供的函数,但会否定返回值

    然后,isNotNaN被设置为一个函数,当参数不是
    NaN
    时,它将返回
    true
    ,当参数是
    NaN
    时,它将返回
    false

    var isNotNaN = negate( isNaN );
    
    最后,
    NaN
    被放入函数中,返回
    false的预期结果

    show( isNotNaN( NaN ) );
    
    让我们从顶部开始:

    function negate( func )
    {
      ...
    }
    
    使用参数
    func
    声明函数
    negate
    。该函数返回一个匿名函数:

    function(x)
    {
      return !func(x);
    }
    
    匿名函数将执行原始函数的
    func
    参数中提供的函数,但会否定返回值

    然后,isNotNaN被设置为一个函数,当参数不是
    NaN
    时,它将返回
    true
    ,当参数是
    NaN
    时,它将返回
    false

    var isNotNaN = negate( isNaN );
    
    最后,
    NaN
    被放入函数中,返回
    false的预期结果

    show( isNotNaN( NaN ) );
    

    不,我实际上是一个老家伙,正试图自己学习Javascript……我希望这是家庭作业,因为那时我就有老师了!不,我实际上是一个老家伙,正试图自己学习Javascript……我希望这是家庭作业,因为那时我就有老师了@谢谢你的解释。在步骤4中,isNaN的返回值的逻辑对立面是什么?@mjmitche:不客气。
    isNaN
    函数始终返回布尔值(true或false)。
    logical NOT运算符为您提供与其后的布尔值相反的值。因此,如果
    isNaN
    返回
    true
    ,则
    将使其成为
    false
    ,反之亦然……当我说*“布尔值的对立面”时,显然
    true
    false
    本身就是布尔值,所以它只是提供了相反的结果。但是javascript中的每种类型都有某种布尔值,所以有时
    用于将其强制为相反的布尔值。例如,任何字符串(空字符串除外)都被视为
    true
    (或通常称为“truthy”)。所以如果我的字符串是“patrick”,非空字符串是truthy,那么
    !“patrick”
    给了我
    false
    。我可以用另一个
    再次翻转它,所以
    !!“patrick”
    告诉我
    true
    …因为
    isNaN
    函数会告诉您传递的值是否是数字(或者可以成功转换为数字),然后执行
    !isNaN()
    将给出与此相反的结果。在ot