2013-03-24 64 views
0

我学习JavaScript和想测试下面的代码:的Javascript:函数的变量知名度

var name1 = "global"; 

function userobject(){ 
    this.name1 = "local"; 
} 
function func() { 
    alert(name1); 
} 

var myobject=new userobject(); 
func(); 
func.call(myobject); 

在我的理解,在第一次调用FUNC按键,警报(“全局”)应被调用, 但在第二次调用func.call(myobject)时,应调用alert(“local”),但实际上在两种情况下均显示“全局”文本。 我想,当执行时,当解释器看到变量名称时,它试图在本地识别它,如果找不到它,它会在父文件中搜索它。 在我的例子中,我认为由于func.call(myobject),父类是myobject,函数应该使用它的name1变量,它被定义为“local”。

请正确指出我在理解这件事上错了什么地方?

+1

'this.name1'不是本地变量,而是'myobject'的*属性*。你不能像变量一样访问它。 – Bergi 2013-03-24 13:00:20

回答

2

当解释程序在范围内找不到name1时,它将开始在外部范围中搜索它,并最终在找不到全局名称空间的情况下搜索它。没有对this的隐式引用,所以name1始终是全局变量,永远不会有任何本地对象属性。如果您曾明确访问属性那么你的代码将继续按照预期:

function func() { 
    alert(this.name1); 
} 

call方法确实this的范围,但它不会改变局部变量参考。你可以有一个与全局对象属性同名的变量,但它们不会是同一个东西。

+0

如果我是正确的,当函数被调用时,解释器创建激活对象,并将该对象的属性作为局部变量和函数参数。这就是范围,不是吗?如果简单地调用func(),那么它意味着全局范围由窗口对象标识。我认为通过使用func.call调用函数,该对象被更改为myobject .. – maximus 2013-03-24 13:16:13

+0

@maximus不,函数的局部变量不是对象的属性。范围仅由函数定义。如果有一个函数,那个函数就有一个范围。 – 0x499602D2 2013-03-24 13:24:01

+0

明白了,谢谢:) – maximus 2013-03-24 13:26:19