我知道顶级函数是window
对象的成员,并且与其中this
引用window
的事实一致。
但是对于非顶级功能,this
仍为window
,但他们不是window
的成员!
以下是一些代码:
function topLevel1() {
alert(this)
}
function topLevel2() {
function inner() {
alert(this)
}
inner()
}
topLevel1() // alerts DOMWindow
alert(window.topLevel1) // alerts text of topLevel1, as expected
topLevel2() // again, alerts DOMWindow
alert(window.inner) // undefined
alert(window.topLevel2.inner) // undefined
inner
既不是window
也不是topLevel2
的成员,其成员是谁? this
window
是window
怎么可能,但它不是this == owner
的成员? owner.
,那么Javascript中的法律不是通过apply
调用的吗? (特殊情况除了构造函数,call
,{{1}}等)答案 0 :(得分:2)
同样,函数的this
值取决于如何调用函数,而不是函数的位置或设计方式。
如果你只是调用一个函数
foobar()
代码中的任何地方,就像那样,其this
值始终为window
(非严格模式)或undefined
(严格)。现在有很多方法可以修改this
,例如使用.apply()
,.call()
或.bind()
调用该函数。所有这些方法都使您有机会修改给定函数的this
值。此外,如果使用new
关键字调用函数,this
将引用新创建的对象(也会返回)。
因此,函数的位置会告诉您关于其上下文的归零或this
。
现在回答您的具体问题:
inner
是来自Activation Object
(ES3)
topLevel2
成员
如上所述
我猜这些也包含在上面
答案 1 :(得分:1)
此关键字的精彩参考是:http://www.quirksmode.org/js/this.html
topLevel2()中的inner()函数只能对topLevel2可见。这是一个范围问题。这就是你未定义的原因。