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

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

new foo();

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

4

4 回答 4

4

bar已超出范围。范围和上下文是有区别的。如果要将属性附加到foo,则必须将属性附加到函数

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

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

new foo();​
于 2012-08-10T00:11:37.557 回答
2

这是因为 foo.bar 是一个私有变量。把它改成这个,它会工作的

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

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

new foo();
于 2012-08-10T00:11:49.337 回答
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因为您没有保留任何创建的对象。

于 2012-08-10T00:10:14.153 回答
1

在您的baz函数foo中没有作为参考传递,它是参数的占位符。当您这样做时,new foo您将foo其用作构造函数。bar是全局的,因为它没有用varor声明this.bar。我认为你需要重新审视基础知识,这个问题太错误了......

于 2012-08-10T00:12:04.750 回答