2

我知道this指向函数在其上运行的当前对象。所以这里是根据定义的代码

function foo(){
    alert(this); //output==window
}

所以,现在函数 foo 等于 window.foo() 但现在在这里

function foo(){
    function fo(){
        alert(this);
    }
    fo();
}

那么,现在foo执行输出时又是窗口对象,为什么?因为嵌套this应该引用不同的对象。因为 fo() 现在不在窗口对象上操作,因为 foo()==window.foo() .所以嵌套函数现在应该指向不同的对象

详情见这里:

 function foo()
{
alert(this);
  function fo(){alert(this);}
as();
}

如果现在,var x=new foo();than foo() 方法中的“this”指向对象对象,但嵌套的 this 指向全局对象,对吗?现在你应该清楚我的意思了

4

4 回答 4

5

正如这里所解释的,关键字this被动态绑定到“.”左侧的对象。在通话时间。上述三个例外。

  1. 当没有.关键字时this,将绑定到全局对象窗口。
  2. 当您使用 call 和 apply 时,您可以决定this绑定什么。
  3. 当您使用关键字 new 从构造函数创建新实例时,关键字this指的是新生成的实例。

既然到了这里,你还在打电话只是fo()this必然window

于 2013-01-04T12:50:08.150 回答
2

两件事情....

首先,您应该考虑使用控制台。( console.log(this);)。

this其次,闭包和范围( )之间存在差异。

关闭:

function a() {
    function b() {
        // b is only available inside `a`
    } 
}
// so out here b will be undefined

范围:

function a() {
    // in here the scope can be multiply things depending on how the function is called. See below
    console.log(this);
}

范围是默认window的,如果函数是对象的方法,则范围指的是对象。

a(); // logs: window

var o = { 
    a: a
};
o.a(); // logs: { a: a }

您可以使用 ether call 或 apply 覆盖此默认行为

var s = [1, 2, 3]
a.call(s); // logs: [1, 2, 3]
// or using apply
a.apply(s) // logs: [1, 2, 3]
于 2013-01-04T12:51:39.147 回答
1

this值取决于函数的调用方式,而不是它的定义方式。如果你有以下功能:

var test = function() {
  console.log(this);
};

然后有很多方法可以调用它:

  • test()- 这将是window
  • new test()- 这将是实例
  • ({ foo: test }).foo()- 这将是对象
  • test.call(bar)- 这将是bar

函数是否嵌套并不重要。

于 2013-01-04T12:50:00.573 回答
0

编程,你做错了。

要使 fo 成为对象的功能,您应该这样做:

function foo(){
    this.fo = function(){
       alert(this);
    }
}
f = new foo();
f.fo();

看看 fo 函数是如何在对象声明中启动的?

现在,当f.fo()你得到[object Object]

于 2013-01-04T12:49:51.383 回答