我正在学习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”。
请正确理解这件事我错了吗?
答案 0 :(得分:2)
当解释器在范围内找不到name1
时,它开始在外部范围内搜索它,并最终在无法找到的情况下进入全局命名空间。没有对this
的隐式引用,因此name1
始终是全局变量,而不是任何本地对象属性。如果您已明确访问该属性,那么您的代码将按预期工作:
function func() {
alert( this.name1 );
}
您的call
方法 将this
放在范围内,但它不会更改本地变量引用的内容。你可以拥有一个与全局对象属性同名的变量,但它们不是同一个东西。