就在我认为我终于理解Javascript范围的时候

就在我认为我终于理解Javascript范围的时候,javascript,scope,Javascript,Scope,我偶然发现了一件事,说明我显然还不明白 有人能解释一下为什么“this”的值会在以下方面发生变化吗 var MyFunc = function(){ alert(this); var innerFunc = function(){ alert(this); } innerFunc(); }; new MyFunc(); 乍一看,我会说这是因为外部的“this”指的是MyFunc,而内部的“this”指的是innerFunc 但是,Javascr

我偶然发现了一件事,说明我显然还不明白

有人能解释一下为什么“this”的值会在以下方面发生变化吗

var MyFunc = function(){
    alert(this);
    var innerFunc = function(){
        alert(this);
    }
    innerFunc();
};

new MyFunc();

乍一看,我会说这是因为外部的“this”指的是MyFunc,而内部的“this”指的是innerFunc


但是,Javascript并不是我特别擅长的东西。

在Javascript中,
这个
表示调用函数的上下文对象,而不是定义函数的范围(或调用函数的范围)。对于
MyFunc
,它引用正在创建的新对象;但是对于
innerFunc
,它引用全局对象,因为调用
innerFunc
时没有指定上下文

这往往会使Java或类似的OO语言相形见绌,在这些语言中,
This
几乎总是引用被调用方法所定义的类的实例。请记住:JavaScript没有方法。或者上课。只是对象和函数

另请参见:作为旁注,“this”不一定总是引用实际函数,因为您可以使用“强制”此引用调用函数,请考虑一个事件处理程序,其中它将引用触发事件的实际元素

使用

yourFunction.apply(此引用、参数)

您可以在“this”将指向作为第一个参数传递的任何内容的地方调用它。

只需执行以下操作:

var MyFunc = function(){
    var self = this;
    alert(self);
    var innerFunc = function(){
        alert(self);
    }
    innerFunc();
};

new MyFunc();

这样的话,赛尔夫永远都是这个意思,不管你从哪里打电话,这通常是你想要的。

Carter,你一定是新来的。。。不要为免责声明而烦恼!你不需要任何专业知识来回答它。。。看看我吧!;-)谢谢你。那么,“这个”和范围/结束之间的关系是什么?很少或根本没有<代码>此的作用域为单个函数-它不会继承到该函数中定义的其他函数的作用域中。它是调用函数的上下文对象,没有别的。啊,可爱的javascript,继续向我揭示她的奥秘。多年来,我一直在假设“this”是在范围链中搜索的,就像其他变量一样。那些日子已经过去了!如果你不知道,self是一个你正在覆盖的全局变量。在此之后检查abc的值:
var abc=function(){return self;}()