这内部功能

时间:2009-12-26 13:17:56

标签: javascript function this

我的问题是:

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

据我所知,它取决于Foo的使用方式,即作为构造函数或函数。 this在不同情况下可以做什么?

6 个答案:

答案 0 :(得分:60)

this关键字引用该函数所属的对象,如果该函数不属于任何对象,则引用window对象。

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

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

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

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

此提醒:Hello, world

您可以使用thisapply()函数来操纵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

答案 1 :(得分:21)

阅读道格拉斯·克罗克福德就此事所说的话,引用他A Survey of the JavaScript Programming Language

  

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

     

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

     

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

     

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

同样“这个”可以根据您的函数调用方式而改变,请在apply functioncall function上阅读。

我建议您花时间学习JavaScript(自由)演示文稿中JavaScript最伟大的思想之一,从here链接。

答案 2 :(得分:6)

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

var foo = new Foo()this将引用即将由foo引用的新创建的对象。

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

答案 3 :(得分:3)

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

  1. 功能
  2. 使用新关键字
  3. 作为对象

    将逐一看到

    1.功能

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

    这里'this'关键字指向窗口对象。

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

    2.Function as a Object

    var example = function () {
      console.log(this);
    };
    
    var obj = new example();
    
    Output : example {}
    

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

答案 4 :(得分:0)

在JavaScript中,一切都是对象甚至是函数。当您在以下代码中说this.foo

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

foo成为Foo对象

的成员变量

答案 5 :(得分:0)

在NodeJS中,有一些有趣的行为:

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

foo() // <- TypeError: Cannot set property 'name' of undefined

但是使用箭头功能:

const bar = () => {
    this.name = 'foo'
    console.log(this)
}

bar() // <- { name: 'foo' }

我总是给人一种印象,传统的函数文字有它自己的上下文,但是没有箭头函数,这似乎与我的理解相矛盾。

鉴于此行为,OP的代码无法正常工作...