javascript:这个关键字

时间:2013-01-04 12:41:06

标签: javascript

我知道this指向功能运行的当前对象。所以这里是根据定义的代码

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

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

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

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

详情请见此处:

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

如果现在,var x = new foo();而foo()方法中的“this”指向对象对象但是嵌套这指向全局对象吗?现在你应该清楚我想说的了什么

4 个答案:

答案 0 :(得分:5)

正如here所解释的那样,关键字this在调用时动态绑定到'。'左侧的对象。 以上有三个例外。

  1. 当没有.时,关键字this被绑定到全局对象窗口。
  2. 当您使用call和apply时,您可以决定this绑定的内容。
  3. 当您使用关键字new从构造函数创建新实例时,关键字this将引用新生成的实例。
  4. 从此处开始,您仍然只是致电fo()this绑定window

答案 1 :(得分: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 }

您可以使用以太网调用或应用

覆盖此拒绝行为
var s = [1, 2, 3]
a.call(s); // logs: [1, 2, 3]
// or using apply
a.apply(s) // logs: [1, 2, 3]

答案 2 :(得分:1)

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

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

然后有很多方法可以称之为:

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

函数是否嵌套并不重要。

答案 3 :(得分:0)

编程,你做错了。

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

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

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

现在当你f.fo() [object Object]时,你会得到{{1}}