Javascript 作为函数参数传递的匿名函数的作用域

Javascript 作为函数参数传递的匿名函数的作用域,javascript,scope,Javascript,Scope,给定以下代码,我应该在警报中看到什么 var a = 100; function afunc(infunc){ a = 10; infunc.call(); } afunc(function(){alert(a)}); 我最初的想法是,我的浏览器应该提醒100,因为变量a=100将在作为参数传递给afunc的匿名函数的作用域内。但这假设匿名函数实际上是在全局上下文中定义的。显然情况并非如此,因为浏览器提醒10。那么,为什么在范围链中a=10领先于a=100呢 谢谢 因为您在调用匿名函

给定以下代码,我应该在警报中看到什么

var a = 100;
function afunc(infunc){
  a = 10;
  infunc.call();
}

afunc(function(){alert(a)});
我最初的想法是,我的浏览器应该提醒100,因为变量a=100将在作为参数传递给afunc的匿名函数的作用域内。但这假设匿名函数实际上是在全局上下文中定义的。显然情况并非如此,因为浏览器提醒10。那么,为什么在范围链中a=10领先于a=100呢


谢谢

因为您在调用匿名函数之前将a设置为10。a实际上是全局的,但您将其设置为10

那么,为什么在范围链中a=10领先于a=100呢

不是。您只定义了1
一个
变量,在发出警报之前,它只是从
100
更改为
10

如果希望
a
s是具有自己值的不同变量,它们都需要
var
关键字:

var a = 100
function afunc(infunc){
  var a = 10;
  infunc.call();
}

afunc(function(){alert(a)})​

考虑以下示例:

var a = 100;

function afunc(infunc){
  a = 10;
  var f = function (){
    console.log(a);
  };
  f.call();
  infunc.call();
}

afunc(function (){ console.log(a); });
function bfunc(){
  var b = 'hello';
  return function (){ console.log(b); };
}

afunc(bfunc());
我们在
afunc
的范围内为
a
赋值10,然后依次调用两个函数,只需记录
a
的值。在本例中,您希望两个函数都将10记录为
a
的值,事实上就是这样

在您的示例中,
infunc
将在与
afunc
中定义的任何本地函数基本相同的范围内执行,而不管它实际定义在何处。由于您在较窄的范围内为
a
赋值,因此在调用
infunc
时,这就是
a
的值

函数确实保留了其定义中的某些范围,如下例所示:

var a = 100;

function afunc(infunc){
  a = 10;
  var f = function (){
    console.log(a);
  };
  f.call();
  infunc.call();
}

afunc(function (){ console.log(a); });
function bfunc(){
  var b = 'hello';
  return function (){ console.log(b); };
}

afunc(bfunc());
在这里,
bfunc
返回的匿名函数实际上是在
afunc
的范围内调用的,但它仍然能够记录
b
的正确值,因为它是在原始范围内分配的。如果要更改
afunc
b
分配不同的值,它仍然会记录
“hello”
,因为
afunc
中定义的
b
bfunc
中定义的
b
是不同的变量