使用';这';在javascript对象方法中
我理解函数上下文在javascript中是一个可延展的概念。但是,当从对象中的另一个方法调用成员方法时,为什么必须在使用';这';在javascript对象方法中,javascript,this,Javascript,This,我理解函数上下文在javascript中是一个可延展的概念。但是,当从对象中的另一个方法调用成员方法时,为什么必须在前面加上这个 var o = { m1: function() { }, m2: function() { this.m1(); // works m1(); // does not work } }; 为什么j/s不能收集上下文呢?好的,这个指的是对象本身相对于它所使用的上下文。 o是您的对象,m1和
前面加上这个
var o = {
m1: function() {
},
m2: function() {
this.m1(); // works
m1(); // does not work
}
};
为什么j/s不能收集上下文
呢?好的,
这个
指的是对象本身相对于它所使用的上下文。
o
是您的对象,m1
和m2
是您对象的成员(方法)。
当调用m1()
而不是this.m1()
javascript时,将在同一范围内(不是对象而是对象之外)查找函数。
这只是一个简短的解释,您可以在这里找到更多信息:
为什么j/s不能收集上下文
这不是一个关于能和不能的问题。Javascript引擎设计为使用某些概念,例如范围
和执行上下文
。仅用几行文字就很难对这些概念做出完整的解释。但这里有(非常)宽泛的界线
范围
Javascript使用词法范围
这是一个定义任何给定函数
都可以访问哪些变量的概念。这取决于您编写代码的方式。根据这一概念,任何给定函数都可以访问您放置的变量:
- 在全球范围内,李>
- 在任何包含相关函数的函数中
这可以通过以下示例来说明:
var one = 'one' //in the global scope
function A () { // access to one and two
var two = 'two'
function B () { // access to one, two and three
var three = 'three'}
function C () { // access to one, two, three and four
var four = 'four'
};
};
};
如果将函数
作为属性
的值
放置在对象
上,它将成为方法
。方法只能访问全局范围(忽略方法中嵌套的函数)和自身内部的变量:
var one = 'one'
var myObj = { // in the global scope
myFunctions: {
myFunction1: function() {}, // have access to one and myObj
myFunction2: function() {} // have access to one and myObj
}
};
这就是为什么在您的示例中,您必须通过调用o.m1()
来访问m1
执行上下文
一个函数总是有一个这个值(忽略箭头函数)
此
的值始终是对象内部的属性。确定哪个对象取决于函数的执行上下文。执行上下文更具体地取决于函数的调用站点,因为此
的值将设置为:
- 包含函数调用的对象(级别);或者如果不包含在另一个函数中
- 全局对象
这可以通过一个例子来说明:
var one = 'one'
var myObj = {
two: 'two',
three: 'three',
myFunction: function () { // this points to myFunction, two and three
function () { //this points to one and myObj
}
};
现在,上面的例子实际上会让你认为,现在你明白了这件事
,因此你降低了警惕,在你意识到这件事之前这件事正咬着你的a**。记住有关函数调用站点的部分是非常重要的:
var myObj = {
name: 'myObj',
myFunction: function() {console.log(this.name)
};
var anotherObj = {
name: 'anotherObj',
notAnotherFunction: myObj.myFunction
};
myObj.Myfunction(); // myObj
anotherObj.notAnotherFunction(); // anotherObj
在上面的示例中,同一函数被调用两次,但调用的调用站点不同,因此this
的值也不同
如果您想自学上述概念,我可以推荐您阅读本系列。这与其说是一个“上下文”,不如说是一个函数参数。每个函数调用都会设置此
(特殊的箭头函数除外)。重复