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
是不同的变量