javascript - 关于js中array.push(function(){})中function的参数的详解????

查看:251
本文介绍了javascript - 关于js中array.push(function(){})中function的参数的详解????的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

在看thunkify的源码时对其中的一段代码不理解,望大神能够帮忙解答

这里是thunkify源代码代码

 args.push(function(){
        if (called) return;
        called = true;
        done.apply(null, arguments);
      });

下面是我自己实验的代码,将arguments打印出来

var args = [1,2,5,4,3];
args.push(function(){
  console.log(arguments);
});
args[5]();

以下为打印结果

不知道源代码中这段代码有何作用,各位大神帮忙分析下,谢谢!!!!!

解决方案

回答里的相当于,我只是打个小比方,不是很精确~

var thunkify = require('thunkify');
var fs = require('fs');

var read = thunkify(fs.readFile);

read('package.json', 'utf8')(function(err, str){
  
});

按官网例子走一遍,首先 read 得到的是一个function,就是源码里thunkify的return;
然后read(xxxx)得到的其实是后面那个function也就是题主说的push的那个外层function。,最后执行fn(function(err, str){})

源码里args首先是拷贝了最开始read(xxx)的参数,到最后执行的时候args再push一个function【姑且叫pf】。

然后执行

      try {
        //fn即例子里的fs.readFile
        fn.apply(ctx, args);
        //这里相当于 fs.readFile('package.json', 'utf8', pf)
      } catch (err) {
        done(err);//done则是 function(err,str){}
      }

显然,正常直接调用readFile应该是

fs.readFile('package.json','utf8',function(err,str){})

而这里巧妙的将最后一个异步回调改成pf,而pf的执行其实是调用了done.apply(null, arguments) //把pf的参数原封不动的传给done,而done在上面代码也说了,就是原来的回调。

所以题主问的push(function)也就是pf,其实就是原本要被thunkify的函数的最后一个function(即异步后的回调函数),那么其对应的参数,就是原函数的回调的参数了。

= = 说的我都有点绕了。希望题主看的懂。

这篇关于javascript - 关于js中array.push(function(){})中function的参数的详解????的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆