这个里面的function

我的问题是:

function Foo() { this.foo = "bar"; // <- What is "this" here? } 

从我可以告诉它取决于如何使用Foo ,即作为一个构造函数或作为一个函数。 这在不同的情况下会是什么?

this关键字指的是函数所属的对象,如果函数不属于任何对象,则指向window对象。

它用在OOP代码中,用来指代函数所属的类/对象例如:

 function foo() { this.value = 'Hello, world'; this.bar = function() { alert(this.value); } } var inst = new foo(); inst.bar(); 

这警报: Hello, world

您可以通过使用apply()call()函数来操作引用的对象。 (有时非常方便的function)

 var bar1 = new function() { this.value = '#1'; } var bar2 = new function() { this.value = '#2'; } function foo() { alert(this.value); } foo.call(bar1); // Output: #1 foo.apply(bar2, []); // Output: #2 

请阅读道格拉斯·克罗克福德(Douglas Crockford)在这个问题上所说的话,引用他的JavaScript编程语言概览 :

一个函数是一个对象。 它可以像其他对象一样包含成员。 这允许一个函数包含它自己的数据表。 它还允许一个对象作为一个类,包含一个构造函数和一组相关的方法。

函数可以是对象的成员。 当一个函数是一个对象的成员时,它被称为一个方法。 有一个特殊的variables,叫做这个,当对象的一个​​方法被调用时,这个variables被设置为对象。

例如,在expression式foo.bar()中,这个variables被设置为对象foo,作为函数栏的一个额外参数。 function栏可以引用这个来访问感兴趣的对象。

在像do.re.mi.fa()这样的深层expression式中,这个variables被设置为do.re.mi对象,而不是对象do。 在一个简单的函数调用中,这被设置为全局对象(又名窗口),这不是很有用。 正确的行为应该是保持当前值,特别是在调用内部函数时。

此外,“这个”可以根据你的函数的调用方式, 应用函数和调用函数进行读取。

我build议你花时间从他的(免费)演示文稿中学习JavaScript的最伟大的思想,从这里链接。

在JavaScript中,约定(这只是一个约定)是任何以大写字母开始的函数都将被用作构造函数。 然后,一个人会打电话

var foo = new Foo()this将引用将被foo引用的新创build的对象。

当然,没有任何东西阻止你自己调用Foo() ,在这种情况下, this将会引用函数被调用的对象。 为避免混淆,不build议这样做。

在JavaScript中,一切都是对象甚至function。 当你在下面的代码中说this.foo

 function Foo() { this.foo = "bar"; // <- What is "this" here? } 

foo成为Foo对象的成员variables