Javascript:函数的变量可见性

时间:2013-03-24 12:53:57

标签: javascript

我正在学习Javascript并希望测试以下代码:

var name1 = "global";

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

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

根据我的理解,首先调用func,应该调用alert(“global”), 但是在第二次调用func.call(myobject)时,应该调用alert(“local”),

但实际上在两种情况下都会显示“全局”文本。 我想,在执行时,当解释器看到变量名时,它会尝试在本地识别它,如果它在那里找不到它,它将在父中搜索它。 在我的情况下,我认为由于func.call(myobject),父对象是myobject,函数应该使用它的name1变量,它被定义为“local”。

请正确理解这件事我错了吗?

1 个答案:

答案 0 :(得分:2)

当解释器在范围内找不到name1时,它开始在外部范围内搜索它,并最终在无法找到的情况下进入全局命名空间。没有对this的隐式引用,因此name1始终是全局变量,而不是任何本地对象属性。如果您已明确访问该属性,那么您的代码将按预期工作:

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

您的call方法 this放在范围内,但它不会更改本地变量引用的内容。你可以拥有一个与全局对象属性同名的变量,但它们不是同一个东西。