JavaScript 回调中的术语“通过”或“通过”是啥意思?

Posted

技术标签:

【中文标题】JavaScript 回调中的术语“通过”或“通过”是啥意思?【英文标题】:What does the term "pass" or "passing" something mean in JavaScript callbacks?JavaScript 回调中的术语“通过”或“通过”是什么意思? 【发布时间】:2019-01-25 09:48:07 【问题描述】:

目前正在学习 javascript 中回调的含义,我正在努力理解回调的工作原理以及传递 this 或传递 that 的术语以及它如何与回调一起工作?我有一些示例代码,我想展示一下并简要解释为什么我不明白。

var users = ["Sam", "Ellie", "Bryan"];

function addUser(username, chickenNugget) 
    setTimeout(function() 
      users.push(username);
      chickenNugget();
    , 200);


function getUsers() 
    setTimeout(function() 
      console.log(users);
    , 100);


addUser("Jake", getUsers);

getUsers();

调用 chickenNugget 时会发生什么?函数中的代码是否会在遇到 chickenNugget 时停止并重置,直到再次调用函数 addUser?

【问题讨论】:

“为什么参数 chickenNugget 被归类为回调” - 因为...它被 addUser 回调了? 添加了新信息 JS 中没有参数类型,所以chickenNugget 只是一个可以传递任何东西的参数(numberstringfunctionobject,...)也可以随意命名。 不清楚你在问什么。您是否尝试运行代码以查看它的作用?这些与标题有何关系? 所以我在看一个关于回调的教程,他使用了不同的术语,比如 this 传递给 this ,我想这是什么意思,他使用 setTimeout 允许回调从addUser 在 getUsers 之前,即使在回调未在 addUser 代码块中实现之前处理了 getUsers 【参考方案1】:

回调是 Javascript 中处理异步的一种方式。有时您有使用 setTimeout 之类的异步函数,但您需要等待这些异步函数完成,然后才能继续运行更多代码(这取决于异步请求),而回调是实现此目的的一种方式。我已经更新了您的示例以说明我上面的意思,希望对您有所帮助:

var users = ["Sam", "Ellie", "Bryan"];

function addUser(username, callback) 
    setTimeout(function() 
      users.push(username);
      // this will be called only after username has been added to users
      callback();
    , 200);


function isJakeInUsers() 
  if (users.includes("Jake")) 
    console.log("Jake is in users! :)");
   else 
    console.log("Jake is not in users! :(");
  


// as a callback, isJakeInUsers will only be called after "Jake" has been added to users
addUser("Jake", isJakeInUsers);

// this gets called immediately, before "Jake" has been added to users
isJakeInUsers();

【讨论】:

【参考方案2】:

回调只不过是传递给以后使用的指令。回调是 javascript 的基础,因为它是一种异步语言。这意味着如果一个操作需要外部服务,它将执行下一个命令,而无需等待该操作完成。

这是一个同步执行的代码示例

var total_in_cart = 0;
var shipping = 0;
var total = 0;

total_in_cart = 100; // USD
shipping = 10;
total = total_in_cart + shipping;
console.log(total);

这将输出 110,因为它会等待每一行完成执行,然后再执行下一行。

下面是一个异步执行代码的例子

var total_in_cart = 0;
var shipping = 0;
var total = 0;

total_in_cart = 100; // USD
shipping = get_shipping_fee_from_dhl_api();
total = total_in_cart + shipping;
console.log(total);

这将输出 100,因为 JS 没有等待 api 调用完成并继续执行新行。为了解决这个问题,您必须发送进一步的指令,以便在 api 请求完成后回调,因此使用回调这个词。

因此,在这种情况下,您必须将所有计算封装到可以作为回调可执行文件发送的代码中。在 JS 中,您将使用一个函数并将其分配给一个变量,然后您将其传递给将接受它并执行它的函数。

请记住

function getUsers() 

是一样的

var getUsers = function() ;

【讨论】:

以上是关于JavaScript 回调中的术语“通过”或“通过”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 JavaScript 回调在 C# 中运行 QUnit 测试并返回测试结果?

通过 Javascript 中的变量范围维护变量

经过身份验证的服务不支持跨域 javascript 回调。通过 SSL 代理对 WCF 服务的 AJAX 查询

什么是 PHP 中的 Closures/Lambda 或 Javascript 中的外行术语? [复制]

javascript回调函数那些事~

通过回调或猫鼬模型验证 PassportJS?