长话简说JavaScript(4)什么是执行上下文与作用域

执行上下文:是根据变量或函数访问哪些数据,操作他们的行为,这些过程中需要必须有上下文来决定。这个上下文定义的所有变量和函数都存在于这个对象上。虽然不能通过代码访问变量对象,但是后台根据变量处理数据。类似于Java项目debug执行程序时variables列表里的临时变量,程序执行完后,这些临时变量就会消失。下面介绍一下全局上下文是什么?
全局上下文:相当于在window系统下的window对象,通过var定义的全局变量和函数都会成为window对象的属性和方法,let和const定义的不会在全局上下文中,但是作用域解析上效果都是一样的。全局上下文在应用程序退出前才会被摧毁,例如关闭网页。
上下文中的代码在执行中,产生的变量对象会有一个作用域链。这个作用域链巨顶了各级上下文中的代码在访问变量和函数时的顺序。
作用域链增强:我们通过增加语句导致在作用域链前端临时添加一个上下文,试用try/catch 语句的 catch 块或者with 语句

function buildUrl() { 
 let qs = "true"; 
  try {
    let url = qs; 
}
catch(err) {
    // catchCode - 捕获错误的代码块
}  
 return url; 
}
console.log(buildUrl()); // ReferenceError: url is not defined

变量声明:我们以前介绍过JavaScript声明变量有三种,推荐使用了 let 和 const 两个关键字,然而var不推荐使用,那么这三种声明变量作用域究竟如何呢?
使用 var 声明变量时,变量会被自动添加到最接近的上下文。在函数中就是函数局部上下文。如果变量未经声明就被初始化了,那么它就会自动被添加到全局上下文。

function add(num1, num2) { 
 var sum = num1 + num2; 
 return sum; 
} 
let result = add(10, 20); // 30 
console.log(sum); // ReferenceError: sum is not defined

使用 let声明变量时,跟var差不多,她的作用域是块级的,如果定义在if语法块中他的作用域就在这语法块中,varlet的区别: 重复的 var 声明会被忽略,而重复的 let 声明会抛出 SyntaxError。

for (var i = 0; i < 10; ++i) {} 
console.log(i); // 10 
for (let j = 0; j < 10; ++j) {} 
console.log(j); // ReferenceError: j is not defined

使用 const声明变量时,必须同时初始化为某个值。声明以后,在其生命周期的任何时候都不能再重新赋予新值。如果const 声明是一个对象,这个对象就不能再重新赋值,但对象的键不受限制。
标识符查找:在代码正常执行时,在特定上下文中为读取或写入而引用一个标识符时,再通过搜索确定这个标识符表示什么,如果在局部变量找到,搜索就会停止,如果没有找到,搜索至全局变量,如果没有找到,说明其位定义

var color = 'blue'; 
function getColor() { 
 let color = 'red'; 
 { 
 let color = 'green'; 
 return color; 
 } 
} 
console.log(getColor()); // 'green' 寻找离自己最近的
var color = 'blue'; 
function getColor() { 
 let color = 'red'; 
 { 
 let color = 'green'; 
 return window.color; 
 } 
} 
console.log(getColor()); // 这个直接找window对象,但是window没有定义显示为空
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听不见你的名字

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值