嵌套功能& JavaScript中的“this”关键字

时间:2012-09-13 16:29:26

标签: javascript this

" this关键字始终引用包含函数的方法的对象。"

很棒,听起来很简单,但这就是我想知道的......

例如:

function func1() {

  function func2() {
    alert(this == window); // true
  }

  func2();

  alert(this == window); // true
}

func1.func3 = function () {

  alert(this == window); // false
  alert(this == func1); // true

};

func1();
func1.func3();

现在,因为func1实际上是全局window)对象的一种方法(一个分配给的属性func1的函数对象> global object)thisfunc1引用全局对象是合理的,因为func3是{{1}的方法在func1this引用func3的函数对象是有意义的。

困扰我的是func1。我知道嵌套函数中的func2也应该引用全局对象,但我不确定为什么因为this不是<的方法em>全局对象。据我所知(这是我可能完全错误的部分)func2func2调用(激活/变量)对象的方法。现在,如果我对此(我不确定自己)是对的,那么func1this func2不应提及func1&# 39; s调用对象而不是全局对象?

所以,我想我的问题是:嵌套函数是嵌套函数的调用(激活)对象的方法,如果是,不应该{t = {1}}指的是调用对象而不是全局对象?

3 个答案:

答案 0 :(得分:5)

  

this关键字始终引用包含函数的方法的对象。

没有。不幸的是,这并不容易。 MDN的documentation of the this keyword给出了很好的概述。当函数作为方法 on 被调用时,它被设置为对象,但还有其他可能性。默认情况下,thisundefined被调用时没有任何特殊情况,就像您使用func1func2一样。对于草率(非严格)模式函数undefined(和null)不使用,this确实指向全局对象(浏览器中为window)那种情况 - 你在观察什么。

但是当函数作为构造函数(使用new关键字)调用时,它也可以指向新鲜的对象实例,或者在用作处理程序时指向事件目标(如DOM元素)。最后但并非最不重要的是,可以使用callapplybind手动设置...

this与嵌套无关。嵌套函数声明/表达式仅影响变量的范围(“隐私”,可用性)。虽然函数的变量范围永远不会改变,但this的值在每次调用时都可能不同 - 它更像是一个额外的参数。

答案 1 :(得分:3)

函数内this关键字的含义取决于函数的调用方式。 JavaScript中有4种不同的函数调用模式。

  1. 函数调用模式foo()
  2. 方法调用模式o.foo()
  3. 构造函数调用模式new foo
  4. 致电/应用模式foo.apply(...)foo.call(...)
  5. 仅在#2中,函数内的this引用函数是方法的对象。

    您正在使用函数调用模式调用func2()。执行此操作时,this引用全局对象。

    正如@Bergi所建议的,请参阅https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/this以获取有关this含义和不同函数调用模式的更多详细信息。

答案 2 :(得分:1)

  

但我不确定为什么因为func2不是全局对象的方法。

函数内定义的任何内容都是该函数范围的本地内容。因此func2属于func1的本地范围,因此未附加到window

在Javascript中,this的值通常基于您调用函数的方式。当您调用没有任何前导对象的函数时,this通常设置为全局父对象,即window

您可以通过三种方式明确设置this的值:

myObj.func(a, b); //this set to myObj implicitly because myObj is the parent 

func.call(myObj, a, b); //this set to myObj explicitly; the first argument 
                        //to call sets the value of this for that function

func.apply(myObj, [a, b]); //this set to myObj explicitly; the first argument
                           //to apply also sets the value of this for that
                           //function.

this可能是一个棘手的概念。 MDN的good article约为this