采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
老师你好 我前几天面试阿里问了三个问题我没答出来 自己查了一些资料也觉得还是理解不够透彻 1.全局作用域下 window a = 1 和var a=1的区别联系 2.setinveal两次运行的时间小于设置的时间原理是什么,我知道settimeout是小于设置的时间,因为浏览器运行宏任务有4ms的延迟 3.let不能重复声明的原理 期待老师的回复!
第二题,setInterval 和 setTimeout 都是宏任务,小于设置时间的原理也应该都是一样的。细说原理的话,可以查一下 event loop 的执行过程。
非常感谢!
第一题,window.a = 1 和 var a = 1 的区别和联系。一个是给全局的对象 window 加一个属性,一个是定义个全局的对象。如果在一个函数中要获取自由变量 a 的话,根据作用域规则,会先去根据父级作用域,找不到则继续往上一级一级的查找(作用域链),最后找到全局作用域。如果全局作用域找不到,则去 window 下找属性。具体可以这么代码演示一下。
window.a = 1;
var
a = 2;
window.b = 10;
function
fn() {
console.log(a);
// 2
console.log(b);
// 10
}
fn();
不知道我表达清楚了没有~
还有一个区别: ```js // 使用var声明 var a = 1; Object.getOwnPropertyDescriptor(window, 'a'); // {value: 1, writable: true, enumerable: true, configurable: false} // 不使用 b = 2; Object.getOwnPropertyDescriptor(window, 'b'); // {value: 2, writable: true, enumerable: true, configurable: true} ``` 变量声明自带不可删除属性,前者是变量声明,带不可删除属性,因此无法被删除; 后者为全局变量的一个属性,因此可以从全局变量中删除。
老师“如果全局作用域找不到,则去 window 下找属性”这句话有问题吧 老师的代码调换一下声明顺序: var a = 2; window.a = 1; window.b = 10; function fn() { console.log(a); // 1 console.log(b); // 10 } fn(); 如果是全局作用域找不到,则去 window 下找属性,那应该输出不变
window.a === a,给window.a赋值,var a的值也会变吧
问题1 https://blog.csdn.net/qq_43670193/article/details/115604870
网上看到一篇文章中提到了第二个问题。https://www.365jz.com/article/24406
第三题,let 不能重复声明,这是 ES6 语法的规定,所以 JS 解释器在解析语法时,会检查的一个错误。其实 var 能重复声明,let 不能重复声明,这就是一个语法规定。然后解释器按照语法执行规则检查。
我们知道,在一个 JS 作用域(如函数)执行的时候,没声明一个变量,都会存入栈中。var 能重复声明,也就是每次声明都覆盖栈的内容为新内容。let 不能重复声明,也就是检查到栈里有这个变量,就不然覆盖了。
说白了,还是个规则。
登录后可查看更多问答,登录/注册
面向1-3年前端的框架及项目面试“刚需内容”
4.3k 1
2.8k 11
1.4k 11
1.3k 11
购课补贴联系客服咨询优惠详情
慕课网APP您的移动学习伙伴
扫描二维码关注慕课网微信公众号