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

访问方法内部的变量';JavaScript中的s函数,javascript,scope,Javascript,Scope,我是JavaScript的新手,因此请原谅任何不正确的术语/理解 我试图在方法ec.get中从回调函数function(thebest,all)中提取变量thebest 我已经读了一些关于作用域的内容,我希望下面的代码能够正常工作,但是函数外的最好的变量的作用域似乎与方法函数内的变量不同 var thebest = 0; ec.get("id", function(thebest,all) { }); alert(thebest); var thebest = 0; ec.get("id",

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

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

我已经读了一些关于作用域的内容,我希望下面的代码能够正常工作,但是函数外的
最好的
变量的作用域似乎与方法函数内的变量不同

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

我还尝试在外部使用不同的变量名,但没有任何区别。如何从方法及其函数外部访问“最内部的”
thebest
变量的值?谢谢

这里似乎有几个问题:

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

var thebest = 0;
ec.get("id", function(thebest,all) { });
alert(thebest);
var thebest = 0;
ec.get("id", function(theNewBest,all) { theBest = 'new value' });
alert(thebest);
问题2:假设
ec.get()
是一个网络操作,它可能是异步的,这意味着你传递给它的回调函数直到很久以后才会被调用。这意味着,当警报触发时,完成回调函数尚未执行。所以,它不会改变任何事情

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

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

一种方法如下:

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:如果要更改回调函数中的
theBest
的值,则不能通过将其作为参数传递来进行更改。简单变量通过值传递,因此如果在函数中更改原始变量,则不会更改原始变量

var thebest = 0;
ec.get("id", function(thebest,all) { });
alert(thebest);
var thebest = 0;
ec.get("id", function(theNewBest,all) { theBest = 'new value' });
alert(thebest);
问题2:假设
ec.get()
是一个网络操作,它可能是异步的,这意味着你传递给它的回调函数直到很久以后才会被调用。这意味着,当警报触发时,完成回调函数尚未执行。所以,它不会改变任何事情

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

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

一种方法如下:

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);

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

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

您的问题是您正在重新定义
最佳
作为函数的参数

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

您的问题是您正在重新定义
最佳
作为函数的参数

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

定义为函数参数的最佳变量仅存在于括号之间的函数范围内。仅函数(thebest,all){
此处
}定义为函数参数的最佳变量仅存在于括号之间的函数范围内。仅函数(最好的,全部){
此处
}