传递函数数组作为参数,为函数中的每个函数运行该函数

时间:2016-01-29 04:35:39

标签: javascript arrays function

我试图将一个函数数组作为参数传递给函数x,然后在函数x中执行它们。我也会以某种方式传递参数,但有些参数只在函数x中初始化。

有些功能包括:

_showData(data,type);
console.log(data);
$('#loading').remove();

以下是一个示例:

// Called somewhere else 
runFunctions([$('.dashboard').remove, $('.screen-loading').remove]);

var runFunctions = function(functions){
  // do some things
  for (var i = 0; i < functions.length; i++){
     functions[i]();
}

有什么想法吗?

编辑: 抱歉,我刚刚意识到程序不知道对象是什么,因为我正在通过ajax调用来改变范围。

var runFunctions = function(functions){
  $.ajax({
    method: "POST",
    url: "php/database.php",
    dataType: "JSON",
    data: {type:type},
    success: function(data, type){
      for (var i = 0; i < functions.length; i++){
        functions[i]();
      }
    }
  })
}

<击>

这个怎么样:

  _accessDatabase( 
    function(onSuccess){
      $('.dashboard').remove();
      var type = 'home';
      _showData(data,type); // it doesn't know what data is, how can I pass it through?
      $('.screen-loading').remove();
    }
  );


var _accessDatabase = function(onSuccess){
  $.ajax({
    method: "POST",
    url: "php/database.php",
    dataType: "JSON",
    data: {},
    success: function(data){
      onSuccess(data); 
    }
  })
}

我想将var数据传递给onSuccess函数,我该怎么做?

解决:

var _request_successful = function onSuccess (data){
  console.log("running onSuccess");
  $('.dashboard').remove();
  var type = 'home';
  _showData(data,type);
  $('.screen-loading').remove();
}

_accessDatabase(_request_successful);


var _accessDatabase = function(onSuccess){
  $.ajax({
    method: "POST",
    url: "php/database.php",
    dataType: "JSON",
    data: {},
    success: function(data){
      onSuccess(data); 
    }
  })
}   

1 个答案:

答案 0 :(得分:1)

此代码的问题在于您在forLoop中调用的函数未绑定到任何内容。取而代之的是。

// Called somewhere else 
runFunctions([
  $('.dashboard').remove.bind($('.dashboard'))
, $('.screen-loading').remove.bind($('.screen-loading'))
]);

function runFunctions(functions){
  // do some things
  for (var i = 0; i < functions.length; i++){
     console.log("running")
     functions[i]();
  }
}

你可以做的是:

function call(method, objs) {
  objs.forEach(function (obj) {
     obj[method]()
  })
}
call('remove', [$('.dashboard'), $('.screen-loading')])

这是一个工作小提琴:https://jsfiddle.net/ogfgocp4/

为了解释一下它是如何工作的,我不确切地知道JavaScript的内部,但当你这样做:$('.dashboard').remove时,它会返回remove函数。如果你立即调用它,它将被绑定到给你方法的对象。如果你将它影响到别的东西,那么它将被绑定到它被调用的对象。

这里有一小段代码,我想这很好解释。

var obj = {
    fun: function () {
    console.log(this)
  }
}
var fun2 = {
    a: 1
}

//this -> obj
obj.fun()

// this -> window
fun = obj.fun
fun()

// this -> fun2
fun2.fun = obj.fun
fun2.fun()

当您致电obj.fun时,this将成为对象obj。当您将方法影响到var时,this会变为window,因为它是此范围内的默认对象。然后,如果我们最终将函数绑定到对象fun2并立即调用它,this现在是对象fun2