5

鉴于以下代码,我应该在警报中看到什么?

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

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

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

谢谢!

4

3 回答 3

6

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

于 2012-07-20T16:30:22.187 回答
6

那么为什么在作用域链中 a=10 领先于 a=100 呢?

它不是。您只定义了 1 个a变量,它只是在被警告之前从 更改100为。10

如果您希望as 是具有自己值的不同变量,则它们都需要一个var关键字:

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

afunc(function(){alert(a)})​
于 2012-07-20T16:31:13.353 回答
1

考虑以下示例:

var a = 100;

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

afunc(function (){ console.log(a); });

a我们在 的范围内赋值 10 afunc,然后依次调用两个函数来简单地记录 的值a。在这种情况下,您会期望两个函数都将 10 记录为 的值a,而这实际上就是发生的情况。

在您的示例中,infunc将在与 中定义的任何本地函数基本相同的范围内执行afunc,而不管它实际定义的位置。由于您a在更窄的范围内分配了一个值,这就是a您调用infunc.

函数确实从它们的定义中保留了一些范围,如下例所示:

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

afunc(bfunc());

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

于 2012-07-20T16:54:41.460 回答