GO全局对象和VO(G)全局变量对象的关系
1.两者之间存在映射关系(一个改另一个跟着改)【除了基于let/const创建的变量】
2.在全局上下文代码执行的时候,遇到一个变量,首先看是否为全局变量
(如果是操作全局变量,【var/function声明会给window也设置一份】),
不是全局变量则继续看是否为GO的属性(如果是相当于省略window),
如果也不是则按照没有声明这个变量的错误处理
块级上下文
{
console.log(foo)
function foo(){1}//函数在块级里面变量提升只声明
foo=1
function foo(){2}//在全局和块级都会有一份function foo(){2}覆盖1
//到执行最后一个foo才会给全局映射一份
}
console.log(foo)
1.在代码执行的时候,浏览器会把 function foo(){}这行代码之前所有对foo的操作,
不仅认为是私有的,也会给全局映射一份
2.但之后代码"对foo"的操作都是私有的了
#如果不是foo的变量还是属于全局的(function变量提升是声明加定义,var只定义)
函数块级上下文
函数执行会形成私有上下文
但是如果:
1.有形参赋值默认值
2.函数体中有声明过自己的私有变量(var/let/const)
则会把函数体{}看做一个私有的块级上下文
此时,函数执行有了两个上下文
var x=1
function func(x,y=function anonymous1(){x=2}){
var x=3
y()
console.log(x)
}
func(5)
console.log(x)