使用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
答案 0 :(得分:1)
功能是对象。您在调用函数this
时向Foo()
引用的内容添加“x”属性,但代码中没有任何内容调用它。
如果您要调用这样的函数:
Foo.call(Foo);
在检查Foo.x
的值之前,它会起作用。但是,通常,函数调用中this
的值不是对函数本身的引用。
你也可以这样做:
Foo.x = "bar";
通常,在函数中为this
分配属性,特别是用作构造函数的属性,用于管理对象的属性(不是的对象)功能本身)。所以:
var f = new Foo();
将为您提供一个名为“x”且值为“bar”的属性的对象。
答案 1 :(得分:0)
只需删除return this;
并使用var f = new Foo()
即可。然后console.log(f.x)
就可以了。
答案 2 :(得分:0)
谈论非严格的"模式,在您使用它的上下文中,this
关键字默认为全局对象,因为它尚未通过调用函数本身来设置。因此,您只需在x
对象上设置window
属性。
答案 3 :(得分:0)
调用Foo.x将返回'undefined'
,因为x是实例(对象)属性而不是函数属性(Foo.x = "bar"
)。将x声明为类(函数)属性Foo.x = "bar";
,而不是在console.log(Foo.x)
中调用它。
在这种情况下,x
是一个实例属性(this.x ='bar'
),而不是一个类(function
)属性(Foo.x='bar'
)来访问Foo.x
,Foo
必须实例化为“var foo = new Foo()
”,而不是调用foo.x
返回Foo's
x
实例属性。