4

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对象属性的函数对象),所以inside指的是全局对象,并且因为是函数对象的方法,所以有意义那里面指的是'函数对象。thisfunc1func3func1thisfunc3func1

困扰我的是func2。我知道this嵌套函数内部也应该引用全局对象,但我不确定为什么因为func2不是全局对象的方法。据我了解(这是我可能完全错误的部分)func2func1调用(激活/变量)对象的方法。现在,如果我对此是正确的(而且我不确定我是否正确),那么不应该this在内部func2引用func1's call object 而不是全局对象?

所以,我想我的问题是:嵌套函数是否是嵌套函数的调用(激活)对象的方法,如果是,不应该this引用该调用对象而不是全局对象?

4

3 回答 3

5

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

不,不幸的是,这并不容易。MDN 上的关键字文档this提供了很好的概述。当函数作为方法调用时,它被设置为对象但还有其他可能性。默认是在没有任何特殊的情况下this调用undefined它,就像你用func1and做的那样func2。对于草率(非严格)模式函数undefined(和null)虽然没有使用,但在这种情况下this确实指向它们的全局对象(window在浏览器中) - 你正在观察什么。

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

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

于 2012-09-13T16:39:58.040 回答
3

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

  1. 函数调用模式foo()
  2. 方法调用模式o.foo()
  3. 构造函数调用模式new foo
  4. 调用/应用模式foo.apply(...)foo.call(...)

只有在#2 中,this函数内部指的是函数是方法的对象。

您正在func2()使用函数调用模式进行调用。这样做时,this指的是全局对象。

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

于 2012-09-13T16:52:59.167 回答
1

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

在函数内部定义的任何东西都是该函数范围内的。sofunc2属于 的局部范围,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 有一篇关于this.

于 2012-09-13T16:32:47.650 回答