这个内部函数

IT技术 javascript function this
2021-02-03 14:29:10

我的问题是:

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

据我所知,它取决于如何Foo使用,即作为构造函数还是作为函数。this在不同的情况下可以什么

6个回答

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

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

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

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

var inst = new foo();
inst.bar();

这提醒: 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
如果你有 class Foo { function Bar() { console.log(this); 在 new Foo().Bar() 中使用“this”应该会产生 Foo,而不是 Bar。但是如果你使用“var x = new Foo.Bar()”,那么新的 Foo.Bar 对象将被创建并且“this”将指向 Bar。
2021-03-22 14:29:10
我也很好奇。他的解释有问题吗?
2021-03-28 14:29:10
@Danben 的答案强调使用 new 关键字,它创建一个新对象(javascript 原型方式)。没有它,就不会创建新对象,并且该函数将“嵌入”(如果我可以这样说)它所属的对象,或者全局窗口对象(如果在浏览器中)。
2021-04-09 14:29:10

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

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

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

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

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

此外,'this' 可以根据您的函数的调用方式而改变,阅读apply functioncall function

我建议您花时间从 JavaScript 最伟大的头脑之一中学习他的(免费)演示文稿,链接从这里

Crawford 页面上指向 Yahoo URL 的链接都已损坏。我能找到的最有可能的替代方案是从以下位置开始的 4 视频序列:youtube.com/watch?v=v2ifWcnQs6M
2021-03-14 14:29:10

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

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

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

阐明 new 关键字的用法很棒,因为几乎没有一个普通用户熟悉基于 javascript 原型的对象的工作方式,这会引起太多混淆。
2021-03-31 14:29:10

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

  1. 功能
  2. 用作对象,通过使用 new 关键字

会一一看到

1.功能

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

example();

Output : window

这里的'this'关键字指向window对象。

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

2.函数作为对象

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

var obj = new example();

Output : example {}

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

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

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

foo成为Foo对象的成员变量

'window' 范围是这里的重点。非常好,@JustAMartin。
2021-03-24 14:29:10
我可能有 function MyClass () { function MyMethod () { console.log(this); 并且那个日志调用应该记录 MyClass,而不是 MyMethod。请注意,MyClass 和 MyMethod 都是函数,但如果不是故意这样设计,没有人会调用 new MyClass.MyMethod()。
2021-03-30 14:29:10
展开 Luka 的例子:如果 Foo() 不是某个自定义对象的成员函数,它会成为全局对象的成员函数(window如果在网络浏览器中执行),在这种情况下this仍将指向window,然后foo将成为的成员变量window.
2021-04-04 14:29:10