将对象作为参数传递后的未定义属性

时间:2012-08-10 00:07:44

标签: javascript

function foo() {
    bar = 'ok';
    new baz( this );
}

function baz( foo ) {
    alert( foo.bar );
}

new foo();

为什么警报显示“未定义”而不是“确定”?

4 个答案:

答案 0 :(得分:3)

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();​

答案 1 :(得分:2)

因为foo.bar是一个私有变量。将其更改为此并且它将起作用

function foo() {
    this.bar = 'ok';
    new baz(this);
    }

function baz(foo) {
    alert(foo.bar);
    }

new foo();

答案 2 :(得分:1)

因为变量不是属性(WRT全局变量/属性除外)。您正在通过不使用bar语句创建全局变量var。即使您使用var,它也不会显示在正在构造的对象上。

由于您使用的是new,因此您可以在this上设置该属性。

this.bar = "ok"

所以完整代码是......

function foo() {
    this.bar = 'ok';
    new baz(this);
    }

function baz(foo) {
    alert(foo.bar);
    }

new foo();

顺便说一句,new关键字在baz上被浪费,因为您没有保留任何创建的对象。

答案 3 :(得分:1)

baz函数foo未作为参考传递时,它是参数的占位符。当您执行new foo时,您使用foo作为构造函数。 bar是全球性的,因为它尚未与varthis.bar一起声明。我认为你需要重新审视基础知识,这个问题太错了......