将回调的范围设置为执行回调的位置
Setting the scope of a callback to where it is executed?
我试图理解为什么这会报警为true?如果可能的话,我如何在不向回调函数传递参数的情况下发出false警报?
var a = true;
function foo(callback){
var a = false;
callback();
}
function bar(){
alert(a);
}
foo(bar); // Alerts true
由于在说a = false
时使用var
,因此创建了一个新的、本地作用域的a
。
如果您想在更大的范围内修改现有的变量,请去掉var
。
这:
var a = false;
对于foo
函数的作用域而言是本地的。
此:
function bar(){
alert(a);
}
在a = true
的变量范围内创建,因此,在该局部变量环境上关闭,从而在特定的a
变量上关闭。
归根结底,无论何时创建一个函数,它都会永久保留创建它的变量范围。
将该函数传递到另一个环境中并不重要。它将始终只引用其原始变量环境。
var test0 = 0; // global variable environment
function a() {
var test1 = 1; // "a()" will always retain the global environment even if you
// send "a()" somewhere else
function b() {
var test2 = 2; // "b()" will always retain the environment of "a()" and the
// global environment, even if you send "b()" somewhere else
}
}
编辑:
为了使bar
引用foo
本地的变量,可以将它们作为参数传递给bar
:
var a = true;
function foo(callback){
var a = false;
callback( a );
}
function bar( a ){
alert( a );
}
foo(bar); // now it alerts false
示例:http://jsfiddle.net/dSZ4M/
您会注意到,我为bar()
中的参数指定了与全局a
变量相同的名称。因为函数的参数是在函数自身变量环境之外的变量之前读取的,所以a
参数"阴影">是全局a
变量。
因此,您无法再从bar
内部读取全局a
。当然,您所需要做的就是将参数的名称更改为其他名称,如arg
或其他什么,然后您就可以引用局部arg
参数和全局a
变量。
相关文章:
- 如何在回调函数中执行流
- 如何在`window.open`之后执行回调
- 等待回调函数执行
- 带有Spring的$.getJSON未执行回调
- bookmarklet中的jQuery.getScript()进行回调,但没有成功执行插件
- Dojo AMD加载程序执行定义具有空/缺失依赖项的回调
- 不同'单击'不同脚本中的回调:我可以控制执行顺序吗
- TypeError:执行回调时,回调不是函数
- Javascript:对回调创建的对象执行方法
- AJAX成功回调-执行javascript时出现问题
- nodeJS中的承诺/承诺中的回调/执行顺序是不对的
- 主干:中止以前的路由器回调执行
- 控制器函数作为回调执行
- 函数/回调执行可以被外部调用中断吗?
- React setState回调执行序列
- 一个关于nodejs回调执行顺序问题的例子,我不能理解
- 禁用返回按钮,直到回调执行
- 回调函数内部声明的变量是否保留在内存中,还是在回调执行结束时销毁?
- 在javascript中,使用回调执行多个异步函数的最佳实践是什么?
- Javascript中的回调执行序列,从IndexeddB检索