我是JavaScript的新手所以请原谅任何不正确的术语/理解。
我正在尝试从方法thebest
中的回调函数function(thebest,all)
中提取变量ec.get
。
我已经对范围进行了一些阅读,我希望下面的代码能够正常工作,但是函数外部的thebest
变量看起来与方法函数中的变量的范围不同。 / p>
var thebest = 0;
ec.get("id", function(thebest,all) { });
alert(thebest);
我也试过在外面使用不同的变量名,但没有区别。如何从方法及其函数外部访问“最里面的”thebest
变量的值?谢谢!
答案 0 :(得分:2)
这里看起来有几个问题:
问题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
答案 1 :(得分:2)
如果回调是迅速执行的(非异步),那么您可以简单地将其分配给不同命名的变量。例如
var theBest = 0;
ec.get("id", function(theBestArg,all) { theBest = theBestArg; });
alert(thebest);
答案 2 :(得分:2)
您的问题是您正在重新声明theBest
作为您的函数的参数。
var thebest = 0;
ec.get("id", function(theNewBest,all) { theBest = 'new value' });
alert(thebest);