javascript函数可以正常工作

时间:2017-11-27 02:59:10

标签: javascript

我是javascript世界的新手,并尝试构建一个简单的函数,它将与回调函数一起使用。这是代码:

function add(a,b,c, callback) {


  var arr = [];
  if(callback != 'function') {

    for (var i = 0; i<arguments.length;i++)  {

    arr[i] = arguments[i]*2;
    }

  }
    else {

    for (var i = 0; i<arguments.length-1;i++)  {

    arr[i] = callback(arguments[i]*2);
    }
  }

  return arr;
}

function add1 (something) {

  return something + 1;

我想将此代码作为add(1,3,4)或add(1,3,4,add1)运行。但回调函数不起作用。每次进入if语句。任何人都可以告诉我为什么添加(1,3,4,add1)不工作?

2 个答案:

答案 0 :(得分:0)

参数callback与字符串function相等的唯一一次是,如果你作为参数4传递字符串'function' ...当然会导致else代码失败,因为'function'不是函数

因此,在你的情况下,条件总是为真,因为你传递一个函数,而不是字符串“function”作为第四个参数

因此,在add(1,3,4,add1)的情况下,您的代码将返回

[2, 6, 8, NaN]

NaN是尝试将函数乘以2的结果 - N A N umber

if条件更改为

if (typeof callback != 'function')

你会得到你正在寻找的机器人

function add(a, b, c, callback) {

  var arr = [];
  if (typeof callback != 'function') {
    for (var i = 0; i < arguments.length; i++) {

      arr[i] = arguments[i] * 2;
    }
  } else {

    for (var i = 0; i < arguments.length - 1; i++) {

      arr[i] = callback(arguments[i] * 2);
    }
  }

  return arr;
}

function add1(something) {

  return something + 1;
}
console.log(add(1, 3, 4));
console.log(add(1, 3, 4, add1));

答案 1 :(得分:0)

if(typeof callback != 'function')

如上所述更改您的if语句。由于您只是将回调!=&#39;功能&#39; ,因此JavaScript会找到对象的变量或属性,名为&#39; callback&#39;并尝试将其值与字符串值进行比较,&#39;功能&#39;
当你调用add(1,3,4),它没有回调作为参数时,当然if语句将返回false,因为paremeter 回调有&#39; undefined&# 39;默认情况下。但是,如果您想将回调函数作为参数传递,该怎么办?喜欢添加(1,3,4,add1)

// The arguments when you call add(1,3,4,add1)
▼Arguments(4)
 0: 1
 1: 3
 2: 4
 3: f add1(something)

这种感冒会在这里给你一个错误的数据:

// When i equals 3, arguments[3] * 2 will not work properly, since it's not a number type
if(callback != 'function'){
    for(var i = 0; i < arguments.length; i++){
        arr[i] = arguments[i] * 2;
    }
}


即使你认为你将add1函数作为参数传递,if语句也只是比较&#39;回调&#39;的值。使用字符串值&#39;功能&#39;,它无法正常工作。 因此,为了使其正确,您必须通过使用&#39; typeof&#39; 回调的类型是否属于某种功能>