为什么访问函数对象上的属性会给出未定义

Why accessing property on a function object gives undefined?

本文关键字:未定义 属性 访问 函数 对象 为什么      更新时间:2023-09-26
函数

对象Foo时访问它的属性x使用this运算符给出undefined。为什么?

function Foo(){ 
        this.x = "bar";
        return this;
    }
console.log(Foo.x); //undefined

我相信声明一个函数 JS 会自动创建一个函数对象,您可以向其添加属性。例如,这有效:

Foo.today = "Sunday";
console.log(Foo.today); // Sunday

函数是对象。您将向调用函数Foo()this引用的任何内容添加"x"属性,但代码中没有任何内容调用它。

如果要像这样调用函数:

Foo.call(Foo);

在检查 Foo.x 的值之前,它会起作用。但是,通常,函数调用中的 this不是对函数本身的引用。

您还可以执行以下操作:

Foo.x = "bar";

通常,将属性分配给函数中的this,尤其是用作构造函数的属性,是为了管理对象(不是函数本身的对象(的属性。 所以:

var f = new Foo();

将为您提供一个具有名为"x"的属性和值为"bar"的对象。

只需删除return this;并使用var f = new Foo() 即可。然后console.log(f.x)就会起作用。

在非"严格"模式下,在您使用的上下文中,this关键字默认为全局对象,因为它尚未通过调用函数本身来设置。因此,您只需在window对象上设置x属性即可。

调用 Foo.x 将返回'undefined'因为 x 是一个实例(对象(属性而不是函数属性(Foo.x = "bar"(。将 x 声明为类(函数(属性Foo.x = "bar";而不是在 console.log(Foo.x) 中调用它。

在这种情况下,x是实例属性(this.x ='bar'(而不是类(function(属性(如Foo.x='bar'(来访问Foo.xFoo必须"var foo = new Foo()"实例化,而不是调用foo.x返回x的实例属性Foo's