javascript:这个关键字

javascript:这个关键字,javascript,Javascript,我知道这个指向当前对象,函数在该对象上运行。这是根据定义的代码 function foo(){ alert(this); //output==window } 所以,现在函数foo等于window.foo() 但是现在在这里 function foo(){ function fo(){ alert(this); } fo(); } 那么,现在当执行foo时,输出又是窗口对象了,为什么?因为嵌套的这个应该引用不同的对象。因为fo()现在不是作为f

我知道
这个
指向当前对象,函数在该对象上运行。这是根据定义的代码

function foo(){
    alert(this); //output==window
}
所以,现在函数foo等于window.foo() 但是现在在这里

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

有关详细信息,请参见此处:

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

如果现在,var x=newfoo();而foo()方法中的“this”指向object object,但嵌套this指向global object,对吗?现在你应该清楚我的意思了,编程,你做错了

要使fo成为对象的函数,应执行以下操作:

function foo(){
    this.fo = function(){
       alert(this);
    }
}
f = new foo();
f.fo();
查看如何在对象声明中启动fo函数


现在,当您执行
f.fo()
时,您会得到
[object object]
值取决于函数的调用方式,而不是定义方式。如果您具有以下功能:

var test = function() {
  console.log(this);
};
那么有很多种方式来称呼它:

  • test()
    -它将是
    窗口
  • newtest()
    -它将是一个实例
  • ({foo:test}).foo()
    -它将是对象
  • test.call(bar)
    -它将是
    bar
函数是否嵌套并不重要。

如前所述,关键字
this
在调用时动态绑定到位于“.”左侧的对象。 上述情况有三个例外

  • 当没有
    时,关键字
    将绑定到全局对象窗口
  • 当您使用call和apply时,您可以决定此
  • 绑定到什么
  • 使用关键字new从构造函数创建新实例时,关键字this
  • 引用新生成的实例 从这里开始,您仍然只调用
    fo()
    这个
    绑定到
    窗口

    两件事

    首先,您应该了解如何使用控制台。(
    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);
    }
    
    范围是每个默认的
    窗口
    ,如果函数是对象的方法,则范围指对象

    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]
    

    你期望它等于什么?你仍然在运行
    fo()
    所以
    this==window
    @pimvdb不,它不是在运行。它是一个嵌套函数,怎么能运行得这么简单呢?oo现在我必须详细解释你仔细看这段代码。function foo(){function(){alert(this);}}现在,当x=new foo()时,“this”在方法中指向全局对象,因为它是嵌套的,对吗?@MaizerePathak,我知道,但基本上是一样的。我只是想向你解释一下事情是如何运作的。@NULL无论如何,谢谢你的帖子。但这并不是我想要的。第一段代码通常被称为“范围”。
    值通常称为“上下文”。快速回答:)关于全局范围,由于执行上下文具有受限权限,有时它不会是
    窗口
    对象。例如,如果该函数是从Web Worker中调用的,这里将详细介绍