这个里面的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