访问方法内部的变量's函数

Accessing a variable inside a method's function in JavaScript

本文关键字:函数 变量 方法 内部 访问      更新时间:2023-09-26

我是JavaScript的新手,所以请原谅任何不正确的术语/理解。

我试图从方法ec.get中的回调函数function(thebest,all)中提取变量thebest

我已经读了一些关于作用域的内容,我希望下面的代码能起作用,但函数外的thebest变量似乎与方法函数内的变量处于不同的作用域。

var thebest = 0;
ec.get("id", function(thebest,all) { });
alert(thebest);

我也尝试过在外部使用不同的变量名,但没有什么不同。如何从方法及其函数外部访问"最内部"thebest变量的值?谢谢

这里似乎有几个问题:

问题1:如果要更改回调函数中theBest的值,则不能通过将其作为参数传递来更改。简单变量是按值传递的,因此如果在函数中更改原始变量,则不会更改原始变量。

问题2:假设ec.get()是一个网络操作,它可能是异步的,这意味着传递给它的回调函数要很久以后才能调用。这意味着,当您的警报触发时,完成回调函数还没有执行。所以,它还不会改变任何事情。

问题3:不能以声明回调的方式将参数传递给回调。这将定义这些参数,但除非ec.get()将像那样传递参数,否则在调用时这些参数实际上不会存在。请记住,是ec.get()在内部调用您的函数。它单独决定回调得到的参数。你无法改变这一点。

问题4:当您为函数声明一个与本地或全局变量同名的参数(在您的示例中为thebest)时,您会创建一个名称冲突,导致该参数接管函数作用域的名称,并使更高级别的变量不可访问。通常,使用与作用域中的任何其他变量相同的名称来命名函数参数是个坏主意。它只是要求你或其他阅读你代码的人在使用这个名称时感到困惑,并对修改或阅读的内容做出错误的假设。

一种方法如下:

var thebest = 0;
var all = "whatever";
ec.get("id", function() {
    // use the arguments "thebest" and "all" here which are available 
    // from the higher scope.  They don't need to be passed in
    alert(thebest);
    alert(all);
});
// you can't alert on the value of thebest and all here because 
// an asychronous callback won't have yet been called and 
// won't have yet modified those values

如果回调是快速执行的(而不是异步的),那么您可以简单地将其分配给一个不同名称的变量。例如

var theBest = 0;
ec.get("id", function(theBestArg,all) { theBest = theBestArg; });
alert(thebest);

您的问题是将theBest重新定义为函数的参数。

var thebest = 0;
ec.get("id", function(theNewBest,all) { theBest = 'new value' });
alert(thebest);