Without giving,there is no victory.
最近整理一下以前的笔记,所以把之前的记录都搬到掘金上来了
今天遇到一个问题,就是如下代码的输出
var str = '全局变量str';
(function () {
console.log(globalThis.str)
var str = '局部变量str';
})()
花费十秒钟,思考一下输出的是什么? 全局变量str? 局部变量str?
直接开门见山,这段代码,在浏览器环境输出为全局变量str,在node环境下输出为undefined;
这主要是因为在浏览器控制台中,全局作用域下的变量会被自动绑定到 window对象上,因此可以直接使用 window.str 或者 str 来访问全局变量。
在这个例子中,虽然在函数内部声明了一个同名的局部变量 str,但是在函数内部没有声明全局变量 str,因此在控制台中执行这段代码时,console.log(str)会输出全局变量 str 的值,即 全局变量。
但是如果将这段代码放到其他 JavaScript 环境中执行,比如 Node.js 环境中,由于没有自动绑定全局变量到对象上,因此会输出 undefined。
原因是:我们先捋一下顺序,在函数内部,变量查找的顺序是先查找函数内部的变量,如果没有找到,再去外部查找;
在这里由于var str = '局部变量str';这句代码的存在,或者说是var str这个初始化代码(声明语句)的存在,导致globalThis.str访问的不是外部的全局变量str,而是在函数内部刚刚声明的str变量,由于声明提升的存在,会导致虽然声明语句在打印语句后面,globalThis.str访问的是函数内部的str变量,同时,又是因为变量提升,赋值不会提升,导致打印的是undefined(浏览器环境会自动绑定,所以是全局变量str),这句话可能有点绕,需要慢慢理解。
因此输出的结果是 undefined。如果想要输出外部的变量,可以使用 globalThis.str 或者 window.str(在浏览器环境下)来访问全局变量。
问题:nodejs中外部已经定义了一个str变量为全局变量str,为什么打印的不是全局变量str?
问:那么如何才能访问到外部变量全局变量str
可以直接使用 console.log(str) 来访问外部的全局变量 str,或者在函数内部避免声明同名的局部变量,例如将 var str = 全局变量str 改为 str1 = '全局变量str'
问:解释一下js代码中的globalThis
globalThis 是一个在 ES2020 中引入的新的全局对象,它提供了一种跨平台的访问全局对象的方式。在浏览器环境中,全局对象是 window,而在 Node.js 环境中,全局对象是 global。为了避免在不同的平台上编写不同的代码,可以使用 globalThis 来访问全局对象,它会根据当前的执行环境自动确定全局对象的引用。在之前的 JavaScript 版本中,可以使用 window 或者 self 来访问全局对象,在 Node.js 环境中可以使用 global。但是在一些特殊情况下,这些方法可能会失效,因此推荐使用 globalThis 来访问全局对象。