将对象作为参数传递后的未定义属性
问题描述:
function foo() {
bar = 'ok';
new baz(this);
}
function baz(foo) {
alert(foo.bar);
}
new foo();
为什么警报显示“未定义”而不是“ok”?将对象作为参数传递后的未定义属性
答
bar
已超出范围。 There is a difference between scope and context。如果要将属性附加到foo
,则必须attach the property to the function。
function foo() {
this.bar = 'ok';
new baz(this);
}
function baz(foo) {
alert(foo.bar);
}
new foo();
答
因为变量不是属性(WRT全局变量/属性除外)。您正在通过不使用var
语句创建全局变量bar
。即使您使用var
,它也不会显示在正在构建的对象上。
由于您使用的是new
,因此您可以将该属性设置为this
。
this.bar = "ok"
所以完整的代码...
function foo() {
this.bar = 'ok';
new baz(this);
}
function baz(foo) {
alert(foo.bar);
}
new foo();
顺便说一句,在new
关键字在baz
因为你不保留创建的任何对象浪费。
答
它是因为foo.bar是一个私有变量。将其更改为这一点,它会工作
function foo() {
this.bar = 'ok';
new baz(this);
}
function baz(foo) {
alert(foo.bar);
}
new foo();
答
在你baz
功能foo
作为参考不被通过,它是一个参数的占位符。当你做new foo
你正在使用foo
作为构造函数。 bar
是全球性的,因为它尚未与var
或this.bar
一起声明。我认为你需要重新审视基础知识,这个问题太错误了......
+0
也许我应该,但我来自PHP,今天是我第二天用JavaScript编码。谢谢。 – Sophivorus 2012-08-10 00:40:37
虽然混淆事项,全局变量_are_属性的'window' ... – Alnitak 2012-08-10 00:12:14
@Alnitak:是的,好点。我会补充说明。谢谢。 – 2012-08-10 00:12:50