Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
试图理解javascript中的“this”_Javascript_Scope - Fatal编程技术网

试图理解javascript中的“this”

试图理解javascript中的“this”,javascript,scope,Javascript,Scope,我有一个具有多个功能的对象: var someScopeScopedObject = { myFunction1: function () { console.log('foo'); }, myFunction2: function () { this.myFunction1(); } init: function (callback) { callback(); } } 因此,如果我调用someScopedObject.myFunction2

我有一个具有多个功能的对象:

var someScopeScopedObject = {
  myFunction1: function () {
    console.log('foo');
  },

  myFunction2: function () {
    this.myFunction1();
  }

 init: function (callback) {
    callback();
  }
}
因此,如果我调用someScopedObject.myFunction2,效果会很好

但如果我执行someScopedObject.initsomeScopedObject.myFunction2,则会得到一个错误,即this.myFunction1未定义

当我以这种方式调用函数时,为什么这无效?

此引用的关键字指向函数范围。而不是全球范围。您声明了一个名为myFunction2的函数,它指的是该函数的作用域,而不是声明该函数的作用域

它不像在语言中,比如C,它指的是类的当前实例,不管你是在另一个方法中。

它指的是声明它的函数, 在你的例子中

var someScopeScopedObject = {
  myFunction1: function () {
    console.log('foo');
  },

  myFunction2: function () {
    this.myFunction1();
  }

 init: function (callback) {
    callback();
  }
}
myFunction1未在myFunction2内声明,因此

` myFunction2: function () {
        this.myFunction1();
      }.
不可能,因为此.myFunction1;尝试调用方法myfunction1,该方法应在myfunction1中声明,但在myfunction1中未声明

编辑:

someScopedObject.myFunction2;可能是因为您正在调用在SomeScopedObject中定义的方法myFunction1

SomeScopedObject.InitSomeScopedObject.myFunction2;不可能,因为在本例中,您将SomeScopedObject.myFunction2作为回调函数传递给init函数

init:函数回调{ 回调; }

然后它会呼叫

myFunction2:功能{ 这是我的功能1; }

在这里,您可以引用这个.myFunction1;--这不存在,因为您引用的是在myfunction2中定义的myfunction1,而myfunction2不是

当您将myFunction2作为参数传递给某个对象时,它将丢失对其所属对象的引用。这现在指的是函数本身,而不是SomeScopedObject,因此您的问题是:


这也是为什么有些库采用对象上下文作为方法,例如jasmine的SpyonSomeScopedObject myFunction2,以保持范围正确

jasmine使用的一个示例如下所示:

var someScopeScopedObject = {
  myFunction1: function () {
    console.log('foo');
  },

  myFunction2: function () {
    this.myFunction1();
  },

  init: function (context, callbackName) {
    context[callbackName]();
  }
}
这将允许您执行以下操作:

someScopeScopedObject.init(someScopeScopedObject, "myFunction2");
这不是最漂亮的。或者,可以将对象绑定到函数,使作用域保持不变。这假设您的原始代码位于SomeScopedObject中:

这两种方法都不好看,实际上,这是因为从外部将属于某个对象的函数作为回调提供给该对象是很奇怪的

最佳解决方案可能是:

someScopeScopedObject.init(function() {
    someScopeScopedObject.myFunction2();
});

那么,当直接调用它时,它为什么起作用呢?但不是通过init调用它所使用的函数,如果您在myfunction2中使用this.myfunction1,那么您试图调用myfunction2中定义的methid myfunction1,我仍然不理解第一个函数的工作原理,第二个方法在第一个方法中没有显示,您正在调用对象SomeScopedObject中定义的“myfunction2”,而在第二个方法中,您没有调用相同的方法,因为您的this.myFunction1不存在。由于myfunction1不是在myfunction2中定义的,而是在SomeScopeDobject中定义的。当您将myfunction2作为参数传递给某个对象时,它将丢失对其所属对象的引用。这现在指的是函数本身,而不是SomeScopedObject,因此您的问题是:这也是为什么有些库为方法采用对象上下文,即jasmine的SpyonSomeScopedObject myFunction2,以保持范围正确。@NielsAbildgaard谢谢!这就是我一直在寻找的答案,有什么好办法吗?
someScopeScopedObject.init(function() {
    someScopeScopedObject.myFunction2();
});