Javascript:function';s变量可见性

Javascript:function';s变量可见性,javascript,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(my

我正在学习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)时,应该调用警报(“本地”)

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


请纠正我在理解这些东西时的错误之处?

当解释器在范围中找不到
name1
时,它开始在外部范围中搜索它,如果找不到,则最终进入全局名称空间。没有对
的隐式引用,因此
name1
始终是全局变量,而不是任何局部对象属性。如果已显式访问该属性,则代码将按预期工作:

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

您的
调用
方法确实将
放在范围内,但它不会更改局部变量引用的内容。您可以使用与全局对象属性同名的变量,但它们不会是相同的东西。

此。名称1
不是局部变量,而是
myobject
的属性。你不能像变量一样访问它。如果我是正确的,当调用函数时,解释器创建激活对象,并将局部变量和函数参数作为该对象的属性。这就是范围,不是吗?如果只是调用func(),则表示全局范围由窗口对象标识。我认为通过使用func.call调用函数,该对象将更改为myobject..@maximus否,函数的局部变量不是对象的属性。作用域仅由函数定义。如果有函数,则该函数具有作用域。