2012-08-02 107 views
1
var a = { 
    text : 3, 
    logText : function() { 
     console.log(this.text); 
    }, 
    callLogText : function() { 
     logText(); 
    } 
}; 
a.callLogText(); 

这将产生一个ReferenceError: logText is not defined错误消息。为什么需要“this”来调用对象中的函数

取而代之,你在logText()方法前加this,它会好的。没有错误味精会弹出。

var a = { 
    text : 3, 
    logText : function() { 
     console.log(this.text); 
    }, 
    callLogText : function() { 
     this.logText(); 
    } 
}; 

我真的不知道原因。

+4

我不认为你向我们展示了所有的代码。我没有在任何地方看到'barral'。 – Raekye 2012-08-02 07:16:17

+2

它与范围有关。 'this'指的是'var a',如果你不使用'this',它会寻找一个叫做'logText'的全局函数。 – Gavin 2012-08-02 07:16:28

回答

3

您需要了解JavaScript范围规则。 This blog post gives a good introduction

简而言之,当您使用变量名时,JavaScript遵循一些规则(为了解释的目的,函数定义与变量声明非常相似)。

什么可能混淆你是这样的:

var a = { b: ...}; 
var a = function() { var b = ... } 

在这两种情况下,你会得到一个新的变量a。在第一种情况下,它是属性b的对象。在第二种情况下,这是一个函数,其具有嵌套范围,其中定义了新变量b

JavaScript将在当前变量和所有父变量中查找变量。但对象定义不是范围。就JavaScript而言,属性b是不可见的,除非通过使用始终引用“当前”对象(在您的示例中,即a)的特殊变量this使其可见。

由于对象a的属性不在“范围内”,所以JavaScript找不到logText(),除非您告诉它查找this。如果你什么也没说,JavaScript会查看当前范围(函数callLogText的主体),然后查找父范围(其中定义了a),然后在任何父范围内查找。

+1

非常好的解释。如果有人需要进一步了解范围和执行上下文:http://stackoverflow.com/questions/11148353/javascript-scope-and-execution-context和http://davidshariff.com/blog/what-is-the-execution -context合的JavaScript / – 2012-08-02 07:47:04

0

这不是一个怪癖。这就是大多数语言在对象时的功能。

logText()a对象的方法,不是函数。

您需要在内部调用方法this.methodName()或外部调用object.methodName()

0

logText();将执行未定义的全局函数logText

this.logText();将执行功能a.logText

0

调用

logText(); 

意味着某处有一个名为logText()函数,但在这里你已经定义logText()作为一个对象的属性,所以访问logText(),你必须参考它在它定义的对象的帮助下。在这种情况下它是在同一个对象中,所以你通过说这个来引用同一个对象。

相关问题