嵌套函数和JavaScript中的关键字“this”(Nested functions & the

2019-07-31 13:22发布

“的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 全局对象),这是有道理的, this里面func1指的是全局对象,并且因为func3是的方法func1的功能对象是非常有意义的this内部func3func1的功能对象。

困扰我的事情是func2 。 我知道, this嵌套函数内部也应该引用全局对象,但我不知道为什么,因为func2不是全局对象的方法。 据我理解(这是我可能是完全错误的有关部分) func2是的方法func1的调用(激活/可变的)对象。 现在,如果我是对这个(我不知道我是),那么不应该this里面func2func1的通话对象,而不是全局对象?

所以,我想我的问题是:是一个嵌套函数被嵌套在函数的调用(激活)对象的方法,如果是这样,不应该this指的通话对象,而不是全局对象?

Answer 1:

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

号不幸的是,这是不容易的作为。 在该文件的this关键字在MDN给出了一个很好的概述。 它被设置为当调用该函数时作为的方法的对象,但也有其他possibilies。 默认的是, thisundefined ,当它被称为没有什么特别的,像你这样做func1func2 。 对于马虎(非严格)模式功能undefined (和null ),虽然都没有用, this确实指向全局对象( window在浏览器中),他们在这种情况下-你正在观察什么。

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

this无关筑巢。 嵌套函数声明/表达式仅影响变量的作用域(“隐私”,可用性)。 虽然函数的变量范围从未改变,价值this可以在每次调用不同-它更像是一个额外的参数。



Answer 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和不同的功能调用模式。



Answer 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有一个很好的文章关于this



文章来源: Nested functions & the “this” keyword in JavaScript