Javascript:function';s变量可见性
我正在学习Javascript,希望测试以下代码: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
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否,函数的局部变量不是对象的属性。作用域仅由函数定义。如果有函数,则该函数具有作用域。