0

我正在学习 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 变量,该变量被定义为“本地”。

请正确地理解我在哪里错了?

4

1 回答 1

2

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

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

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

于 2013-03-24T13:00:49.080 回答