'this'关键字,不清楚

时间:2011-03-25 07:36:20

标签: javascript this prototype

我对以下代码中的' this '关键字感到困惑,有两个'this':

var Foo = function(string){
  this.name=string // 1st-this
}

Foo.prototype.get_name = function(){
  return this.name // 2nd-this
}

var myFoo = new Foo('John')

the_name=myFoo.get_name()

' the_name '等于'John',原型方法通过返回 this.name 获取名称。但有人可以向我解释第一个 - 这个和第二个这个,它们代表什么?

8 个答案:

答案 0 :(得分:15)

在Javascript中,this的值取决于您调用函数的方式

有五种方法可以在JS中调用函数,它们都对this有效:

  1. new Foo();< =这里,您正在创建一个新对象,this将反映该新对象
  2. Foo();< =此处,您按原样调用该函数,this将成为全局对象(!)
  3. var obj = { foo: Foo };
    obj.foo();
    < =这里,您将该函数作为obj的方法调用; this将为obj
  4. Foo.call(thisObject, arg1, arg2);< =此处,您可以在第一个参数中指定this的值
  5. Foo.apply(thisObject, [args]);< =此处,您可以在第一个参数中指定this的值
  6. 在4和5中,callapply之间的区别在于call,您需要单独传递所有参数,而使用apply,您可以传递一个包含所有参数的数组。

    请注意,在我上面的示例2中,函数应该被称为foo而不是Foo。由于不可能知道函数是否应该使用new调用,所以一致意见是如果它是构造函数,则用大写字母开始函数名称(并且应该与{{1一起使用) }});否则,它应该以小写字母开头。

答案 1 :(得分:2)

此链接让您了解:The this keyword

function doSomething() {
   this.style.color = '#cc0000';
}

在JavaScript中,这总是指我们正在执行的函数的“所有者”,或者更确切地说,指向函数是其方法的对象。当我们在页面中定义忠实函数doSomething()时,它的所有者是页面,或者说是JavaScript的窗口对象(或全局对象)。但是,onclick属性由它所属的HTML元素拥有。

答案 2 :(得分:2)

答案是“它取决于”,因为this的含义取决于调用它的 context

例如在回调等内容中,this不再引用当前对象,而更通常引用发生事件的DOM元素:

所以这个看起来相同的功能:

Foo.prototype.handleSomeEvent = function(e) {
    return this.name;
}

如果用作事件回调,则会尝试解析元素的name属性,而不是对象的名称。

答案 3 :(得分:2)

当您使用new关键字this时,您正在创建实例对象。

var foo = new Bar();

即。 Bar的实例被分配到foo


如果不这样做,this就是您所呼叫的方法所在的对象。

var baz = foo.thing();
var boz = thing();

即。第一个示例中为foo,第二个示例中为windowwindow为默认对象)。


您还可以使用apply

来表达它
var baz = foo.thing.apply(bar);

此处this(仍位于thing方法内)为bar

答案 4 :(得分:1)

this指的是调用该函数的对象,在本例中为myFoo。当您将myFoo构建为new Foo('John')时,this关键字可让您设置myFoo.name = 'John',因此当您致电myFoo.get_name()时,它也会让您return myFoo.name }等于John

答案 5 :(得分:1)

在您的示例中,它们是相同的,当您从原型链中重写的方法调用this时,您指的是与在构造函数中调用this时相同的内容。 / p>

使用回调或在原型方法中定义成员变量时会变得更加棘手。

答案 6 :(得分:1)

哇所有这些不同的答案,只有其中一个甚至使用了“上下文”这个词!以下是您问题的直接答案:

this关键字是指向上下文对象的对象引用。

在您的示例中,this引用Foo对象的实例。

答案 7 :(得分:0)

“this”关键字始终引用该函数的所有者。因此,例如,如果您单击访问该功能的按钮,则会引用该按钮。因此,如果您的按钮A具有调用该功能的onclick,那么这是A。

在这种情况下,这将是John,因为在两种情况下他们都引用myFoo,这是John,因为Myfoo用于调用它们