使用';这';在javascript对象方法中

使用';这';在javascript对象方法中,javascript,this,Javascript,This,我理解函数上下文在javascript中是一个可延展的概念。但是,当从对象中的另一个方法调用成员方法时,为什么必须在前面加上这个 var o = { m1: function() { }, m2: function() { this.m1(); // works m1(); // does not work } }; 为什么j/s不能收集上下文呢?好的,这个指的是对象本身相对于它所使用的上下文。 o是您的对象,m1和

我理解函数上下文在javascript中是一个可延展的概念。但是,当从对象中的另一个方法调用成员方法时,为什么必须在
前面加上这个

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
的值也不同



如果您想自学上述概念,我可以推荐您阅读本系列。

这与其说是一个“上下文”,不如说是一个函数参数。每个函数调用都会设置此
(特殊的箭头函数除外)。重复