在浏览Javascript基础知识时,我了解到this
将始终是句点运算符之前的对象,但是
var ob = {
x:"",
setx: function(){
x = "got u"
// in this function this is nothing but ob
}
}
ob.setx();
console.log(ob.x); // this is giving me still ""
console.log(x); // getting here as 'got u'
setx中的 this
应该包含对象ob
的上下文,但是它为什么要访问全局空间而不是访问它自己的x
。
如果我使用setx
,如下所示,则可以使用
setx : function(){
this.x = "got u"
}
为什么我们必须使用this
关键字,即使'getx'上下文绑定到ob
对象
我错过了任何基础知识吗?
是否有任何设计模式可以在子功能之间共享数据(应该是私有的)?这样我们就可以重用子函数了。
答案 0 :(得分:1)
上下文和this
是两个不同的东西。
在JS中,你有一个作用域的上下文(从ES6开始你也有块作用域)。这意味着如果已经使用var,let或const实例化变量的相同名称在不同的范围内可以具有不同的值。
this
是一个对象引用,您可以在其中存储变量和函数。
它与范围不同。您必须使用this.
为所有内容添加前缀,以便将其存储在此内容中。或者从中使用它。
var x = 0; //variable scoped
this.x = 1; //variable on object
this
取决于呼叫站点 - 如何调用函数。
从函数调用的调用站点按顺序确定这个 优先。按此顺序提出这些问题,并在第一个时停止 规则适用。
是否使用new(新绑定)调用该函数?如果是这样,那就是 新建的物体。
var bar = new foo()
使用call或apply(显式绑定)调用函数,甚至 隐藏在绑定硬绑定内?如果是这样,这是明确的 指定的对象。
var bar = foo.call(obj2)
是否使用上下文(隐式绑定)调用函数,否则 被称为拥有或包含对象?如果是这样,那就是上下文 对象
var bar = obj1.foo()
否则,默认为此(默认绑定)。如果在严格模式下,请选择 未定义,否则选择全局对象。
var bar = foo()
那就是它。这就是了解此绑定规则所需的全部内容 用于正常的函数调用。嗯......差不多。
您可以在图书You Don't Know JS
中详细了解相关信息