![](/img/trans.png)
[英]Javascript callback using this keyword in context of function
[英]Function context using callback
为什么这两个不同的代码产生不同的结果?
我的意思是,在第一个代码中定义的foo2
和在第二个代码中定义的callback
相同,并且它们在foo
内部的相同上下文中执行。
第一个代码:
var foo = function () {
var bar = 2;
var foo2 = function () {
console.log("bar: ", bar);
}
foo2();
}
foo() // 2
第二个代码:
var foo = function (callback) {
var bar = 2;
callback();
}
var callback = function () {
console.log(bar);
}
foo(callback); // ReferenceError: bar is not defined
在第二个函数中,bar不在范围内-它仅存在于函数“ foo()”中; 在函数“ callback()”中,bar不存在,这就是为什么您未获得bar的定义错误。 我将其更改为接受参数并打印该参数,如下所示:
var foo = function (callback) {
var bar = 2;
callback(bar);
}
var callback = function (bar) {
console.log(bar);
}
这样,回调将打印bar的传入值。 执行此操作的另一种方法(取决于您的应用程序,但通常不建议使用)是将bar定义为任一函数之外的全局变量:
var bar = 2;
var foo = function (callback) {
callback();
}
var callback = function () {
console.log(bar);
}
两种方法都可以,但是第一种方法是更好地封装代码而不使用全局变量。
编辑:这是第一种方法的混淆性较小的版本,最好不要为了两种可读性而在两种不同的用法中使用“ bar”变量名:
var foo = function (callback) {
var bar = 2;
callback(bar);
}
var callback = function (myBarParam) {
console.log(myBarParam);
}
希望这会有所帮助!
简短的答案,仅仅是因为您从某个地方调用了一个函数,并不意味着该函数可以访问您在调用范围内定义的所有内容。 但是,它可以访问定义范围内的所有内容。 在第一种情况下,它在定义时可以访问bar
。 在第二个示例中,它在定义时没有访问bar
权限,因此在调用它时会抱怨。
长答案: https : //developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope
在第一种情况foo2
是的内部限定foo
因此它可以访问所有的当地人的那foo
访问。 当它绑定bar
它无法在foo2
找到它,然后在foo
查找并使用它在那里找到的那个。
在callback
情况下,它是在foo
之外定义的。 因此,它看不到任何foo
locals,而是得出该值未定义的结论
由于功能范围。 (含义变量只能在声明它们的范围内或在范围链中声明(继续)内访问)
在您的第二个示例中,这变得很聪明。 callback()在全局范围内声明。 当foo()然后调用callback()时,bar变量将不可见,因为bar在另一个函数(foo())中声明。 如果在函数外部(在全局范围内)声明了bar,则可以从任何位置访问它,这也意味着可以在任何函数内部访问。
这将工作:
var bar = 2;
var foo = function () {
callback();
}
var callback = function () {
console.log(bar);
}
foo();
但是,在您的第一个示例中,即使未在foo2()中声明bar,也可以访问它。 这仅仅是因为如果javascript引擎找不到您尝试使用的变量,它将在“父”函数(或范围)中寻找相同的变量。 这称为范围链。
在这两个示例中,您将bar
声明为函数foo的上下文。 该变量将在foo上下文及其所有“ 子上下文 ”中可用。
在第一个示例中,您在foo上下文中声明了第二个函数,因此您可以访问bar
。
在第二个示例中,未在foo上下文中声明回调。 bar
不可用于回调,它不存在。
尝试
var foo = function (callback) {
var bar = 2;
callback(bar);
}
var callback = function (baz) {
console.log(baz);
}
foo(callback);
看一下区别:foo中的bar
是什么,回调中的baz
是-以前,它是未定义的
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.