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

时间:2009-03-16 22:22:00

标签: javascript scope

我遇到的东西说明了我显然还没有得到它。

任何人都可以解释为什么“this”的值在以下变化?

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

new MyFunc();

5 个答案:

答案 0 :(得分:18)

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

这往往会使那些习惯于Java或类似OO语言的语言绊倒,其中this几乎总是引用定义被调用方法的类的实例。请记住:JavaScript没有方法。或者课程。只是对象和功能。

另见:What is the rationale for the behavior of the ‘this’ keyword in JavaScript?

答案 1 :(得分:2)

请执行以下操作:

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

new MyFunc();

这样自我将永远意味着这一点,无论你从哪里调用它,通常都是你想要的。

答案 2 :(得分:1)

作为旁注,“this”不一定引用实际函数,因为你可以使用“强制”this-reference来调用函数,考虑一个事件处理程序,其中将引用触发事件的实际元素。

使用

yourFunction.apply(thisReference, arguments)

你可以调用它,“this”将指向你传递的第一个参数。

答案 3 :(得分:1)

有关闭包的详细说明,请访问:

http://www.brockman.se/writing/method-references.html.utf8

先生。布罗克曼清楚地说明了你遇到的问题。我不时地读这篇文章只是为了能够说:“啊哈!我明白了!”

有关更有趣的JavaScript课程,请访问Douglas Crockford的“Wrrrld Wide Web”

http://www.crockford.com/

作为JSON的创造者,Crockford先生在JavaScript方面是“The Man”。他不了解我,但他已经指导了我对JavaScript的美丽的理解,不仅仅是编程。

你很接近成为比现在更好的程序员。我说这不是一种贬低的意思,而是知道这两位作者如何挑战我自己的技能。

答案 4 :(得分:-1)

乍一看我会说这是因为外部'this'是对MyFunc的引用而内部'this'是对innerFunc的引用。

然而,Javascript不是我有任何特殊专长。