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
只是一个可以传递任何东西的参数(number
,string
,function
,object
,...)也可以随意命名。
不清楚你在问什么。您是否尝试运行代码以查看它的作用?这些与标题有何关系?
所以我在看一个关于回调的教程,他使用了不同的术语,比如 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 回调。通过 SSL 代理对 WCF 服务的 AJAX 查询