如何使用';这';在下面的上下文中使用javascript

如何使用';这';在下面的上下文中使用javascript,javascript,json,function,this,var,Javascript,Json,Function,This,Var,嗨,我正在尝试调用一个函数,它是JSON中的一个属性值 在不同的场景中获得不同的结果 var x = 3; var foo = { x: 2, inner: { x: 1, reValue: function() { return this.x } } } var go = foo.inner.reValue; 案例1: console.log(go()) // 3 案例2: console.l

嗨,我正在尝试调用一个函数,它是JSON中的一个属性值

在不同的场景中获得不同的结果

var x = 3;
var foo = {
    x: 2,
    inner: {
        x: 1,
        reValue: function() {
            return this.x
        }
    }
}

var go = foo.inner.reValue;
案例1:

console.log(go()) // 3
案例2:

console.log(foo.inner.reValue()) // 1

有人能解释案例1吗?

在全局范围内创建变量,自动将其分配给
窗口,因此:

 var x = 3;
 var go = foo.inner.reValue;
 go()
是否与以下内容相同:

 window.x = 3;
 window.go = foo.inner.reValue;
 window.go();
最后一行将调用
go
,上下文(aka
this
)为
window
,因此
this.x
将为
window.x

如果在对象上调用函数,例如在
obj.myMethod()
或等效的
obj[“myMethod”]()
,则此绑定设置为对象(
obj
,在示例中;§13.2.1)。~

您应该了解如何绑定上下文

如果将
go
重新绑定到
foo.internal
,则其行为与预期一致:

go=go.bind(foo.inner)
或者最初:

var go = foo.inner.reValue.bind(foo.inner);
只要未指定上下文,默认情况下会选择全局上下文(对于浏览器,这是
窗口

因此,
在您的示例中指的是
窗口.x
,即
3
此.x通过解释可能是函数的“局部”。
删除“this”以取消本地化,但如果这有问题,您可能需要以消除x歧义的方式写入。

此值根据调用函数的位置确定。以下是一个例子:

让foo={
酒吧:这个,
baz:function(){
console.log(这个)
}
}
console.log(foo.bar);//日志窗口
foo.baz();//日志文件
让hey=foo.baz;

嘿();/日志窗口
请下次正确格式化您的问题…在第一种情况下,
引用窗口对象,它有一个变量
x=3
,而在第二种情况下,
foo
对象,其中
x=2
这不是java@乔纳斯。我想,塞缪尔并不是故意写了什么东西
java-ish
,但也没有说清楚。@thomas我不这么认为<代码>删除“this”
将不起作用。@JonasW。我不是这么说的;)谢谢你的简短解释。