首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在浏览器中打开index.html而不是在节点服务器上为index.html提供服务时‘`this`’是不同的?

为什么在浏览器中打开index.html而不是在节点服务器上为index.html提供服务时‘`this`’是不同的?
EN

Stack Overflow用户
提问于 2019-07-24 11:49:02
回答 3查看 61关注 0票数 0

我有一个index.html文件,引用javascript文件

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">

<head>
    <title>asd</title>
    <meta charset="utf-8">
</head>

<body>
    <div id="app"></div>
    <script src="index.js"></script>
</body>

</html>

在我的index.js

代码语言:javascript
复制
function init() {
    // always prints the window-object
    console.log("init this:", this);
}
var testFunc = () => {
    // this = {} when served
    // this = window when opened directly in browser
    console.log("testFunc this:", this);
}
// prints the window-object when opening index.html
// prints {} when using a server
console.log("this:", this);
init();
testFunc();

为什么直接在浏览器中打开index.html文件(url: index.html使this成为window-object,而使用服务器(url:http://localhost:1234/)为index.html文件提供服务时,有时会给我{},有时给出window

我希望testFunc()能打印{},我也希望能在其他地方得到window。为什么不一样?

注意:我使用包裹来服务我的应用程序。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-07-24 12:13:29

代码语言:javascript
复制
console.log("this:", this);

这在全局执行上下文中引用全局对象。

代码语言:javascript
复制
init();

由于这不是在调用中设置的,而且代码也不是处于严格模式中,因此在init函数中它将引用全局对象(在严格模式下,它将具有未定义的值)。

代码语言:javascript
复制
testFunc();

因为testFunc是一个箭头函数,它的这个函数是从它的封闭作用域(也就是全局对象)中采用的。

在浏览器中,对象是全局对象的别名,具有附加属性(例如,转义、取消转义)并实现窗口接口。

控制台在控制台中显示对象时如何选择表示对象取决于实现。

票数 1
EN

Stack Overflow用户

发布于 2019-07-24 11:53:38

在全局范围内,this将始终引用全局对象。在每个环境中,全局对象是不同的。

有关更多信息:对象

票数 1
EN

Stack Overflow用户

发布于 2019-07-24 11:53:58

this是对当前代码执行环境中的全局对象的引用,所以每次都会不同是正常的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57182213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档