跟大家一起每天进步一丢丢,在学习的路途上不掉队。
[ 经典题 ] 请编写三个API,统计字符串'123你abc好👦👉😄def呀456'中字符数量、字节长度、获取指定索引(码位/字符对应的索引)的字符。
const str = '123你abc好👦👉😄def呀456';
// 获取字符串中字符数量
// 获取字符串中字节长度
// 获取指定索引的字符,例如:getCharAt(str, 9)为👉
- 试题参考答案跟第二天试题一起更新。
- 希望大家积极参与和讨论。
【前端一题】try...catch与JS预编译结合,参考解析:
(function() {
try {
throw new Error();
} catch (x) {
var x = 1,
y = 2;
console.log(x); // 1
}
console.log(x); // undefined
console.log(y); // 2
})();
/**
涉及知识:JS引擎执行代码原理,以V8引擎为准。
JS代码执行步骤:
step1:语法分析(通篇扫描,检测是否有低级的语法错误,此时代码并未执行)
step2:预编译(分为全局预编译、函数预编译,目的产生执行期上下文对象(作用域),加入JS执行栈中,为JS代码的执行提供环境)
step3:解析执行
重点看step2:预编译
1、全局预编译:在全局代码执行的前一刻,生成GO(Global Object)对象,指向所在环境的全局对象
普及知识:
- 每个函数都存在一个[[Scopes]]属性,此属性存放函数定义时和执行时一个一个的作用域,成链式结构,因此称之为作用域链。此属性是私有的,仅限于JS引擎内访问。
- 作用域链顶端始终指向所在环境的作用域(with操作除外,它可以更改作用域链顶端指向)。
- 函数定义位置决定了函数定义时,继承的作用域链。
- 函数预编译生成的作用域对象,在函数作用域链的顶端。
- 变量查找,从当前环境的作用域链顶端往下查找。
2、函数定义时[[Scopes]]值:
0: GO
3、函数执行时,预编译生成AO对象:
{
...,
x: undefined,
y: undefined
}
[[Scopes]]值:
0:AO
1:GO
4、解析执行代码
- 执行try代码块中代码,throw 抛出错误,并被捕获。
- 执行catch代码块中代码,将抛出的错误对象,传递给x
x = 错误对象; // 此x并非,AO对象中的x属性
x = 1; // 进行变量查找,此x非AO对象中的x属性
y = 2; // 进行变量查找,此y即AO对象中的y属性
console.log(x); // 1
- 此时AO
{
...,
x: undefined,
y: 2
}
- 继续往下
console.log(x); // undefined
console.log(y); // 2
*/
专注于原创短更,便于碎片化涉猎知识。希望我走过的路,留下的痕迹,能对你有所启发和帮助。
转发请注明原处,平台投稿请私信。