【问题标题】:Nested functions & the "this" keyword in JavaScriptJavaScript 中的嵌套函数和“this”关键字
【发布时间】:2012-09-13 16:29:26
【问题描述】:

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 实际上是 global (window) 对象的方法(分配给 global 的属性 func1 的函数对象对象)在func1 内部的this 是有意义的,它指的是全局 对象,并且由于func3func1 的函数对象的方法,因此内部的this 是有意义的func3 指的是func1 的函数对象。

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

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

【问题讨论】:

  • 您对this 的“定义”不完整。阅读developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/…
  • 函数的context (this) 在执行时 确定,其值depends on how the function invoked 用于该特定执行。如果以不同的方式(例如,作为对象的方法,从callapply 等)调用,则特定函数中this 的值可能会因调用而异。
  • @RobW 好吧,我确实在互联网上找到了几篇使用此关键字定义的文章,但我想它们可能是错误的,但我仍然想知道嵌套函数部分跨度>

标签: javascript this


【解决方案1】:

this 关键字总是指包含函数的对象。

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

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

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

【讨论】:

  • 好吧,我确实在互联网上找到了几篇使用此关键字定义的文章,但我想它们可能是错误的,但我仍然想知道嵌套函数部分
  • 还有一种情况是它也可以绑定为一个事件监听器,它在上下文设置为目标元素的情况下运行。
  • 是的,我明白这一切,但我想知道的是嵌套函数是否是嵌套函数的调用(激活)对象的方法?
  • 不,它只是一个函数,存储在某个地方。调用函数的调用对象无关紧要。
【解决方案2】:

函数中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/this 以了解有关this 含义和不同函数调用模式的更多详细信息。

【讨论】:

    【解决方案3】:

    但我不确定为什么,因为 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 有一个关于thisgood article

    【讨论】:

    • 虽然该陈述是正确的,但它不能作为问题的答案。您必须突出this 的含义和作用,然后OP才能真正了解问题所在。
    猜你喜欢
    • 2018-10-22
    • 1970-01-01
    • 2017-02-20
    • 2018-10-12
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    相关资源
    最近更新 更多