“的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
内部func3
指func1
的功能对象。
困扰我的事情是func2
。 我知道, this
嵌套函数内部也应该引用全局对象,但我不知道为什么,因为func2
不是全局对象的方法。 据我理解(这是我可能是完全错误的有关部分) func2
是的方法func1
的调用(激活/可变的)对象。 现在,如果我是对这个(我不知道我是),那么不应该this
里面func2
指func1
的通话对象,而不是全局对象?
所以,我想我的问题是:是一个嵌套函数被嵌套在函数的调用(激活)对象的方法,如果是这样,不应该this
指的通话对象,而不是全局对象?
this关键字始终指的是包含函数是的方法的对象。
号不幸的是,这是不容易的作为。 在该文件的this
关键字在MDN给出了一个很好的概述。 它被设置为当调用该函数时作为在其上的方法的对象,但也有其他possibilies。 默认的是, this
是undefined
,当它被称为没有什么特别的,像你这样做func1
和func2
。 对于马虎(非严格)模式功能undefined
(和null
),虽然都没有用, this
确实指向全局对象( window
在浏览器中),他们在这种情况下-你正在观察什么。
但是,它也可以指向新鲜对象实例时被调用的函数作为构造(具有new
的处理程序使用的关键字时),或一个事件的目标(如DOM元素)。 最后,但并非最不重要的,它可以手动设置call
, apply
或bind
...
this
无关筑巢。 嵌套函数声明/表达式仅影响变量的作用域(“隐私”,可用性)。 虽然函数的变量范围从未改变,价值this
可以在每次调用不同-它更像是一个额外的参数。
的含义是this
函数里面的关键字取决于函数被调用的方式。 有在JavaScript中4种不同的功能调用模式。
- 函数调用模式
foo()
- 方法调用模式
o.foo()
- 构造函数调用模式
new foo
- 调用/应用模式
foo.apply(...)
或foo.call(...)
仅在#2是它的是的情况下this
在函数内部指的功能是一个方法的对象。
您正在调用func2()
与函数调用模式。 这样做时, this
指的是全局对象。
正如@Bergi建议,请参阅https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/this上的意义更详细this
和不同的功能调用模式。
但我不知道为什么,因为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
。