整理下之前做的有点疑惑的js基础题目和大家分享以下,如果大家觉得有用,别忘了点一下赞哦
立即执行函数
var foo = 1
;(function foo() {
foo = 10 //flag
console.log(foo)//f foo(){}
})()
console.log(foo)//1
这题的主要问题是
这题主要考察flag处发生了什么?
flag处:这里的foo = 10
并没有对全局变量foo
产生影响,这个操作是对立即执行函数的函数名进行修改,但是未匿名立即执行函数的函数名是只读的,所以该操作不生效
这里做下扩展:
- 非匿名的函数表达式
JS遇到非匿名的函数表达式,会创建一个特定的辅助对象,将函数名作为属性存储,内部可以访问,但这个值是只读的。
- 全局对象和全局变量对象
全局对象GO:是一个对象,系统自带存储属性和方法的堆内存
全局变量对象VO:创建变量存储的地方,是栈内存
不同环境下的全局变量:
web:window,frame
node:global
通用:globalThis
这里举个例子
带var声明创建的变量,会给VO和GO中各存一份
带let或const创建的变量,只会给VO存储一份