这里有什么'这个'参考?

时间:2016-04-21 05:55:51

标签: javascript this

我正在阅读this chapter in You don't know JS

function baz() {
    // call-stack is: `baz`
    // so, our call-site is in the global scope
    console.log("baz");
    bar(); // <-- call-site for `bar`
}


function bar() {
    // call-stack is: `baz` -> `bar`
    // so, our call-site is in `baz`
    console.log("bar");
    foo(); // <-- call-site for `foo`
}

function foo() {
    // call-stack is: `baz` -> `bar` -> `foo`
    // so, our call-site is in `bar`
    console.log("foo");
    console.log(this);
}

baz(); // <-- call-site for `baz`

我希望功能console.log(this)中的foo打印bar,因为bar是呼叫网站,但似乎是window

foo 函数中this引用window而不是bar如何?

3 个答案:

答案 0 :(得分:4)

正如Kyle Simpson所解释的那样,this的价值仅取决于4个条件,具体取决于呼叫网站:

var obj = {
  foo: function() {
    console.log(this);
  }
};

function foo() { console.log(this); }

<强> 1。使用对象调用(隐式绑定)

  

obj.foo();

在这种情况下,使用foo调用obj(始终注意点运算符之前的对象)。因此this引用obj内的foo

<强> 2。 'call'或'apply'(明确绑定)

  

foo.call(OBJ);

此处,this函数内的foo引用obj,因为它已明确绑定。

第3。使用新的(新关键字)

进行通话
  

obj = new foo();

在foo中,this现在引用新创建的对象。

<强> 4。全局对象(默认绑定)

  

FOO();

此处,直接调用foo。因此它默认为window。 (这是你的情况!)

如您所见,在您的情况下,直接调用foo(案例4)。因此this引用window对象。请记住这4个案例,你会很好!

答案 1 :(得分:0)

&#39;这&#39;是指调用函数的对象,而不是调用函数。您是从浏览器(即从网页)运行此代码吗?如果是这样,那么&#39;这个&#39;是代码运行的窗口。

答案 2 :(得分:0)

确实&#39; bar&#39;是呼叫网站,但您必须查看哪个4 rules适用于呼叫网站。在这种情况下,没有new绑定。同样,我们没有看到硬性,显式或隐式绑定,因为foo()没有被执行为obj.foo()。因此,这是一个明确的默认绑定案例,因此this指向全局对象,即window