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

问题描述:

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因为你不保留创建的任何对象浪费。

+1

虽然混淆事项,全局变量_are_属性的'window' ... – Alnitak 2012-08-10 00:12:14

+0

@Alnitak:是的,好点。我会补充说明。谢谢。 – 2012-08-10 00:12:50

它是因为foo.bar是一个私有变量。将其更改为这一点,它会工作

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

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

new foo(); 

在你baz功能foo作为参考不被通过,它是一个参数的占位符。当你做new foo你正在使用foo作为构造函数。 bar是全球性的,因为它尚未与varthis.bar一起声明。我认为你需要重新审视基础知识,这个问题太错误了......

+0

也许我应该,但我来自PHP,今天是我第二天用JavaScript编码。谢谢。 – Sophivorus 2012-08-10 00:40:37