我正在阅读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
如何?
答案 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