被Javascript弄糊涂了'It’这种行为是在特定情况下发生的
Confused by Javascript's this behaviour in a particular situation
我被this在这个简单的代码中发生的事情弄糊涂了:
function foo() {
alert(this.a );
}
function doFoo(fn) {
a = "local";
fn();
}
var a = "global";
doFoo( foo );
据我所知,deFoo是调用foo的上下文对象,因此警报的消息应该是"local"。这是有效的,除非我在doFoo:内声明a
function doFoo(fn) {
var a = "local";
fn();
}
现在警报信息是"全局"。有人能向我解释一下吗?我是Javascript的新手。
需要考虑的几件事:
- 其中的
value
由function
的调用方式决定 - 如果在
global-context
下调用function
,则this
指window
(在浏览器中( - 如果未使用关键字
var
定义variable
,则它是全局变量
在您的示例中,函数doFoo
中的a
指的是window.a
,它是local
,在调用函数时被覆盖。
function foo() {
alert(this.a);
}
function doFoo(fn) {
console.log(window.a);
a = "local"; //window.a is set to "local"
fn();
}
var a = "global"; //window.a is "global"
doFoo(foo);
//Few logs to make it clear
console.log(window.doFoo);
console.log(window.a);
Javascript具有词法范围,因此在您的示例中,this
总是指a
的全局版本,该版本在第一个代码段中被覆盖。
由于var
在该范围中定义了一个新变量,因此您没有修改全局变量,因此在第二个代码段中打印global
。
首先a
是global
,然后我们调用doFoo
,global
a
设置为local
。
我们现在调用fn()
,它调用foo()
,这里this
指的是当前执行上下文。这里this
指的是global
范围。
因此提醒local
给你额外的作业:遵循类似的逻辑,为什么下面提醒global
?
var a = "global"
function thisA()
{
var a = "local";
fn();
}
function fn()
{
alert(this.a);
}
thisA();
范围示例
1.
var a = 3;
function myA()
{
a = 2;
}
myA();
console.log(a); // 2
2.
var a = 3;
function myA()
{
var a = 2;
}
myA();
console.log(a); // 3
3.
var a = 3;
function myA()
{
var a = 2;
myOtherA();
}
function myOtherA()
{
a = 4;
}
myA();
console.log(a); // 4 since myOtherA() sets the global var a = 3 to 4, NOT myA();
4.
var a = 3;
function myA()
{
var a = 2;
function withinA()
{
a = 10;
}
withinA(); // changes var a = 2, to 10 NOT the outer a =3
}
myA();
console.log(a); // Still 3
相关文章:
- 在什么情况下需要同时使用compile&链接函数的角度
- 在特定条件下从存储在localStorage中的阵列中删除对象
- 为什么在这种情况下,“This”确实充当javascript函数中的私有成员
- 在这种情况下,如何正确对齐显示
- 如何在特定条件下完全禁用FullPage.js
- 在以下情况下解释 >= 和 <= 运算符的行为
- 在以下情况下,如何设置图像的宽度
- 返回按钮回调函数在特定情况下失败或未启动
- 如何在特定情况下突出显示活动导航选项卡
- 数据绑定在特定情况下不起作用(AngularJS)
- 在这种特定情况下,如何在 HTML5 画布上重绘圆?(方法调用与直接使用上下文对象)
- Django {{ block.super }} 在特定情况下不起作用
- 在特定情况下删除我的 json 字段
- clearInterval在特定情况下不起作用(javasripct,jquery)
- 在特定情况下使用jQuery/JS更改类
- javascript窗口.setTimeout在特定情况下执行两次
- $(document)中的一个元素.Ready在特定情况下没有定义
- 在特定情况下HTML和javascript的换行标记
- 被Javascript弄糊涂了'It’这种行为是在特定情况下发生的
- $.Deferred reject已忽略,在特定情况下不会触发任何回调