gpt4 book ai didi

javascript - 窗口(浏览器)和全局(Node.js)对象之间的区别

转载 作者:行者123 更新时间:2023-12-01 11:11:10 24 4
gpt4 key购买 nike

我试图了解 Javascript 如何在幕后工作,所以我一直在玩。例如,以下代码在 Chrome 的控制台或 Node.js 中生成不同的输出:

var length = 10;
function fn () {
console.log (this.length);
}
fn();

在 Chrome 中,我记录了值 10,而在 Node 中,这是未定义的。是不是因为在window对象中,全局变量被视为window的属性,而在Node中,全局对象有不同的行为?如果是这样,全局对象中发生了什么,我如何在不声明 global.length 的情况下获得与窗口类似的行为?
我这样做只是作为一种练习,除了理解之外没有其他目的。

最佳答案

造成这种差异的原因是浏览器脚本中的顶级作用域是全局作用域,而 Node.js 文件中的顶级作用域是模块作用域。 (默认情况下,它是处于松散模式的旧式 Node.js 模块,但在现代版本的 Node.js 中,您可以选择进入严格模式的 JavaScript 标准模块范围。)

在全局范围内,var在全局对象上创建一个属性,您可以通过 window 访问它全局,通过 this在全局范围内,或通过 this在一个松散模式的函数中,你调用而不做任何特定于 set this 的操作.您调用fn上面是最后一类:一个不设置 this 调用的松散模式函数.

但在 Node.js 模块范围内,var只创建一个 var在模块中,它不会在全局对象上创建全局或属性。就像这样做:

(function() { // The wrapper Node.js provides node-style modules
// This is "module" scope
var foo = 10;
function fn () {
console.log (this.foo);
}
fn();
})(); // End of the wrapper


(为什么我将 length 更改为 foo ?因为默认情况下, window 具有 length 属性 [窗口包含的帧数],这很令人困惑。:-))

所以这只是范围的不同。

您还可以通过 type="module" 在现代浏览器(包括 Chrome)上使用模块范围在 script标签。但由于 JavaScript 标准模块始终处于严格模式, this在对 fn 的调用中将是 undefined ,导致错误:

<script type="module">
var length = 10;
function fn () {
console.log(this); // undefined
console.log(this.length); // TypeError
}
fn();
</script>

关于javascript - 窗口(浏览器)和全局(Node.js)对象之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60298608/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com