Javascript 什么是';这';这里有参考资料吗?

Javascript 什么是';这';这里有参考资料吗?,javascript,this,Javascript,This,我正在读书 函数baz(){ //调用堆栈是:`baz` //因此,我们的呼叫站点在全球范围内 控制台日志(“baz”); bar();/`bar` //所以,我们的呼叫地点在巴兹` 控制台日志(“bar”); foo();/`bar`->`foo` //所以,我们的通话地点在酒吧` 控制台日志(“foo”); console.log(this); } baz();// “this”指的是调用函数的对象,而不是调用函数的对象。您是否从浏览器(即网页)运行此代码?如果是,那么“this”就是代码运

我正在读书

函数baz(){
//调用堆栈是:`baz`
//因此,我们的呼叫站点在全球范围内
控制台日志(“baz”);
bar();/`bar`
//所以,我们的呼叫地点在巴兹`
控制台日志(“bar”);
foo();/`bar`->`foo`
//所以,我们的通话地点在酒吧`
控制台日志(“foo”);
console.log(this);
}

baz();// “this”指的是调用函数的对象,而不是调用函数的对象。您是否从浏览器(即网页)运行此代码?如果是,那么“this”就是代码运行的窗口。

“this”指的是调用函数的对象,而不是调用函数的对象。您是否从浏览器(即网页)运行此代码?如果是这样,那么“this”就是代码运行的窗口。

正如凯尔·辛普森(Kyle Simpson)精彩地解释的那样,
this
的值仅取决于4个条件,取决于呼叫地点:

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

function foo() { console.log(this); }
1。使用对象调用(隐式绑定)

obj.foo()

在这种情况下,使用
obj
调用
foo
(始终注意点运算符前面的对象)。因此,
这个
指的是
obj
内部的
foo

2调用或应用(显式绑定)

foo.call(obj)

这里,函数
foo
中的
this
指的是
obj
,因为它已被显式绑定

3。使用new(新关键字)呼叫

obj=新的foo()

在foo内部,
这个
现在指的是新创建的对象

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

foo()

这里直接调用
foo
。因此它默认为
窗口
。(这是你的案子!)


如您所见,在您的案例中,
foo
被直接调用(案例4)。因此
引用
窗口
对象。只要记住这4个案例,你就会很好

正如凯尔·辛普森(Kyle Simpson)精彩地解释的那样,
的值仅取决于4个条件,取决于呼叫地点:

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

function foo() { console.log(this); }
1。使用对象调用(隐式绑定)

obj.foo()

在这种情况下,使用
obj
调用
foo
(始终注意点运算符前面的对象)。因此,
这个
指的是
obj
内部的
foo

2调用或应用(显式绑定)

foo.call(obj)

这里,函数
foo
中的
this
指的是
obj
,因为它已被显式绑定

3。使用new(新关键字)呼叫

obj=新的foo()

在foo内部,
这个
现在指的是新创建的对象

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

foo()

这里直接调用
foo
。因此它默认为
窗口
。(这是你的案子!)


如您所见,在您的案例中,
foo
被直接调用(案例4)。因此
引用
窗口
对象。只要记住这4个案例,你就会很好

的确,“bar”是呼叫站点,但您必须查看哪一个应用于呼叫站点。在这种情况下,没有
new
绑定。同样,我们也没有看到硬绑定、显式绑定或隐式绑定,因为
foo()
不是作为
obj.foo()
执行的。因此,这是默认绑定的明显情况,因此
指向全局对象,即
窗口

的确,“bar”是调用站点,但您必须查看哪个应用于调用站点。在这种情况下,没有
new
绑定。同样,我们也没有看到硬绑定、显式绑定或隐式绑定,因为
foo()
不是作为
obj.foo()
执行的。因此,这是默认绑定的明显情况,因此
指向全局对象,即
窗口

窗口。。。。。由于
属于被调用的
方法的
所有者
!(如果不考虑
.bind/.call/.apply
这不取决于调用的位置,而取决于调用的方式(调用方式)。在所有3种情况下,函数都被简单地称为本地函数(与方法等相比)–
fn()
–因此
将是默认值,无论是全局对象(
浏览器中的窗口
)还是
未定义的
(严格模式)。这是在片段后面的几段中讨论的:。这个问题将帮助您解决:——@RayonDabre您可能是说,没有“所有者”这样的东西。调用foo时没有基值或其this,因此在解析其this值时,getBase将返回undefined,其this默认值为全局(浏览器中的窗口)对象,或者在严格模式下保持未定义。@RayonDabre嗯,在将bind(ES5)和arrow函数(ECMAScript 2015)添加到该语言之前都是这样。ECMAScript 2017可能会引入更多变化(或不引入)。;-)窗户。。。。。由于
属于被调用的
方法的
所有者
!(如果不考虑
.bind/.call/.apply
这不取决于调用的位置,而取决于调用的方式(调用方式)。在所有3种情况下,函数都被简单地称为本地函数(与方法等相比)–
fn()
–因此
将是默认值,无论是全局对象(
浏览器中的窗口
)还是
未定义的
(严格模式)。这是在片段后面的几段中讨论的:。这个问题将帮助您解决:——@RayonDabre您可能是说,没有“所有者”这样的东西。调用foo时没有基值或其this,因此在解析其this值时,getBase会将未定义和其this默认值返回到全局(浏览器中的窗口)对象,或者在严格模式下保持未定义。@RayonDa