非顶级函数是否是任何对象的成员?

时间:2012-03-22 00:14:18

标签: javascript

我知道顶级函数是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
  1. 如果inner既不是window也不是topLevel2的成员,其成员是谁?
  2. this windowwindow怎么可能,但它不是this == owner的成员?
  3. 如果是owner.,那么Javascript中的法律不是通过apply调用的吗? (特殊情况除了构造函数,call,{{1}}等)

2 个答案:

答案 0 :(得分:2)

同样,函数的this值取决于如何调用函数,而不是函数的位置或设计方式。

如果你只是调用一个函数

foobar()

代码中的任何地方,就像那样,其this值始终为window(非严格模式)或undefined(严格)。现在有很多方法可以修改this,例如使用.apply().call().bind()调用该函数。所有这些方法都使您有机会修改给定函数的this值。此外,如果使用new关键字调用函数,this将引用新创建的对象(也会返回)。

因此,函数的位置会告诉您关于其上下文的归零或this

现在回答您的具体问题:

  1. inner是来自Activation Object(ES3)

  2. topLevel2成员
  3. 如上所述

  4. 我猜这些也包含在上面

答案 1 :(得分:1)

此关键字的精彩参考是:http://www.quirksmode.org/js/this.html

topLevel2()中的inner()函数只能对topLevel2可见。这是一个范围问题。这就是你未定义的原因。