2020年出现的大厂面试题
面试题1:作用域链
var x = 1;
function func(x, y = function anonymous1() {
x = 2}) {
x = 3;
y();
console.log(x); // 1
}
func(5);
console.log(x); // 1
1.函数func作用域内的变量是私有的,形参赋值x=5,私有赋值x=3,anonymous1函数的作用域链是func,所以函数y()执行会改变x=2,第一个console.log(x)打印2
2.全局作用域,第二个打印数值 x=1
面试题2:作用域
var x = 1;
function func(x, y = function anonymous1() {
x = 2}) {
var x = 3;
y();
console.log(x); //3
}
func(5);
console.log(x);//1
/*
es6中存在块级作用域(只要{}[除对象之外的大括号] 出现let/const/function)
有一种情况也会产生
1.函数有形参赋值了默认值
2.函数体中有单独声明过某个变量
这样在函数运行的时候会产生两个上下文
第一个:函数执行形成的私有上下文EC(FUNC) => 作用域链/形参赋值/...
第二个:函数大括号包起来的就是块级上下文EC(BLOCK)
*/
/*
*EC(G)
*x=1
*func = AAAFFF000
*/
var x = 1;
function func(x, y = function anonymous1() {
x = 2}) {
/*
*EC(FUNC)私有上下文
* 作用域链:<EC(FUNC),EC(G)>
* x=5
* y=anonymous1 [[scope]]:EC(FUNC)
*EC(BLOCK)块级上下文(上级上下文 EC(FUNC))
* 变量提升 var x
* 在代码没有执行之前,我们会把EC(FUNC)中的值也给它一份 x=5
*/
var x = 3; // 块级上下文中的x x=3
y(); // 不是块级的y,向上级找 EC(FUNC)
//anonymous1执行
// 私有上下文EC(AN) 作用域链:<EC(AN),EC(FUNC)>
// x = 2 修改的是EC(FUNC)中的2
console.log(x); //3 块级上下文中的x,还是3
}
func(5);
console.log(x);//1
// 相应三道练习题
{
function foo() {
}
foo = 1;
// =>1
}
console.log(foo); // 函数
//-----------------------------------------