这内部功能

Fra*_*ali 51 javascript function this

我的问题是:

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

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

Atl*_*tli 64

this关键字是指功能所属的对象,或window对象如果函数不属于任何对象.

它在OOP代码中使用,用于引用函数所属的类/对象.例如:

function foo() {
    this.value = 'Hello, world';

    this.bar = function() {
        alert(this.value);
    }
}

var inst = new foo();
inst.bar();
Run Code Online (Sandbox Code Playgroud)

这个提醒: Hello, world

您可以this使用apply()call()函数来操纵哪个对象引用.(有时非常方便)

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
Run Code Online (Sandbox Code Playgroud)

  • 为什么下来投票?只是出于好奇. (4认同)
  • 我也很好奇。他的解释有问题吗? (2认同)
  • 如果你有类Foo {function Bar(){console.log(this); 在新的Foo()中使用"this".Bar()应该导致Foo,而不是Bar.但是如果使用"var x = new Foo.Bar()",则会创建新的Foo.Bar对象,"this"将引用Bar. (2认同)

Zor*_*art 24

阅读道格拉斯·克罗克福德(Douglas Crockford)对此事的评论,引用他对"JavaScript编程语言调查"的看法:

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

函数可以是对象的成员.当函数是对象的成员时,它被称为方法.有一个特殊变量,称为this,在调用对象的方法时设置为对象.

例如,在表达式foo.bar()中,this变量被设置为对象foo,作为函数栏的一种额外参数.然后,功能栏可以参考此来访问感兴趣的对象.

在像do.re.mi.fa()这样的更深层的表达式中,this变量设置为对象do.re.mi,而不是对象do.在一个简单的函数调用中,这被设置为全局对象(aka窗口),这不是很有用.正确的行为应该是保留当前的值,特别是在调用内部函数时.

"this"也可以根据你的函数调用方式而改变,读取apply函数调用函数.

我建议你花时间学习JavaScript(自由)演示文稿中的一个JavaScript最伟大的思想,从这里链接起来.


dan*_*ben 7

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

var foo = new Foo()并且this将引用新创建的对象是即将被引用foo.

当然,没有什么可以阻止你Foo()自己调用,在这种情况下this会引用调用函数的对象.为避免混淆,不建议这样做.


dha*_*ker 6

它取决于该函数的使用方式,我们可以使用两种基本类型的函数

  1. 功能
  2. 通过使用new关键字充当对象

会一一看到

1.功能

var example = function () {
  console.log(this);
};

example();

Output : window
Run Code Online (Sandbox Code Playgroud)

这里的“ this”关键字指向窗口对象。

默认情况下,它应该始终是窗口对象,它指的是根-全局范围。所以当我们console.log(this); 从我们的函数中,因为它是由窗口(仅被调用)调用的,所以我们应该期望此值为我们的窗口对象:

2.作为对象的功能

var example = function () {
  console.log(this);
};

var obj = new example();

Output : example {}
Run Code Online (Sandbox Code Playgroud)

这里的“ this”关键字指向新创建的示例对象。