Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.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 “无法访问”;这";散落物内_Javascript_Object_This_Object Literal - Fatal编程技术网

Javascript “无法访问”;这";散落物内

Javascript “无法访问”;这";散落物内,javascript,object,this,object-literal,Javascript,Object,This,Object Literal,我很难理解如何访问位于我创建的对象文本的一个方法中的这个 以下是一个例子: var app = { click: function(e) { e.preventDefault(); console.log('Clicked'); this.saywhat(); }, saywhat: function() { console.log('Say what ?'); } }; var link = document.querySelector(

我很难理解如何访问位于我创建的对象文本的一个方法中的
这个

以下是一个例子:

var app = {
  click: function(e) {
    e.preventDefault();
    console.log('Clicked');
    this.saywhat();
  },

  saywhat: function() {  
    console.log('Say what ?');
  }
};

var link = document.querySelector('a');
link.addEventListener('click', app.click);
如果单击该链接,我会得到以下错误:
uncaughttypeerror:this.saywhat not a function
。如何使
saywhat()
从内部
click()
可用?(我想找到一个解决方案,在那里我不会被迫使用
app.saywhat()

使用

使用


这是因为
事件处理程序中的
是事件注册的元素,即
链接

在您的情况下,您可以使用
app.saywhat()
,也可以使用显式指定作为
this
使用的内容。就是

link.addEventListener('click', app.click.bind(app));

这是因为事件处理程序中的
是事件注册的元素,即
链接

在您的情况下,您可以使用
app.saywhat()
,也可以使用显式指定作为
this
使用的内容。就是

link.addEventListener('click', app.click.bind(app));

这是因为函数在事件侦听器中被引用,然后在该上下文中调用,使函数中的
this
成为元素,而不是对象文本。函数的定义方式对于它的
this
值并不重要,重要的是它的调用方式。这是因为函数在事件侦听器中引用,然后在该上下文中调用,使函数中的
this
成为元素,而不是对象文本。函数如何定义并不重要,当涉及到它的
这个
值时,重要的是如何调用它。您应该使用
app.saywhat()
,这将是这里唯一合乎逻辑的操作,因为只有一个
app
,而OPS不需要这样做instantiated@vsync我同意,但是如果OP确实有多个对象,可能会调用
app2=Object.create(app)
,或者通过更改代码来使用构造函数,那么就需要绑定了。这就是为什么我列出了这两种方法,这就是我在寻找另一种解决方案时的想法。两位都谢谢,没错。您应该使用
app.saywhat()
,这将是这里唯一合乎逻辑的操作,因为只有一个
app
,而OPS不需要这样做instantiated@vsync我同意,但是如果OP确实有多个对象,可能会调用
app2=Object.create(app)
,或者通过更改代码来使用构造函数,那么就需要绑定了。这就是为什么我列出了这两种方法,这就是我在寻找另一种解决方案时的想法。谢谢两位。