ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

学无止境,学海无涯

2020-04-15 18:07:38  阅读:246  来源: 互联网

标签:浏览器 21 学海无涯 return 520 console 学无止境 log


最近有朋友分享了道题,发现挺有意思的,分享大家了解一下:

(不足之处,请见谅!欢迎指正)

题目如下:

var a = 0;
if (true) {
    a = 1;
    function a() {return '520'}
    a = 21;
    console.log(a);
}
console.log(a);

1.我第一反应是考虑变量提升,即代码等价于:

function a() {return '520'}
var a = 0;
if (true) {
    a = 1;
    a = 21;
    console.log(a); //21
}
console.log(a); //21

接着又想到把函数声明写在判断语句中, 如果{ } 被看做代码块(块级作用域),那么函数的声明就在代码块内做提升,即代码等价于:

var a = 0;
if (true) {
    function a() {return '520'}
    a = 1;
    a = 21;
    console.log(a);  //21
}
console.log(a);  //0

然而实际的结果却感觉不是唯一的情况:

其中IE(5-10)版本浏览器的结果是:

21
21
//以上打印结果为IE浏览器5-10版本。

接着到了IE11 和 最新的 edge浏览器结果是:

21
function a() {return '520'}
//以上打印结果为IE浏览器第11版本和edge浏览器。

结果来看,IE11以及edge浏览器认为, 函数声明为全局, 并且, 函数也没有进行提升, 而是把它当成了表达式处理,因此, 代码等价于:

var a = 0;
if (true) {
    let a1 = 1;
    window.a = function() {return '520'}
    a1 = 21;
    console.log(a1);  //21
}
console.log(a);  // function a() {return '520'}

 

接着我又对比了谷歌和火狐浏览器(并没有去一个个版本尝试),结果如下:

21
1
//以上打印结果为chrome浏览器 和火狐浏览器

可看出:谷歌浏览器跟火狐都认为, 直到出现了函数声明, 变量a才出现了局部作用,同时函数依然被当成了表达式, 而不是一个声明,即代码等价于:

var a = 0;
if (true) {
    a = 1;
    let a1 = function() {return '520'}
    a1 = 21;
    console.log(a1);  //21
}
console.log(a);  // 1

 

总结:

当函数被声明在判断语句内部时,所有浏览器都把 函数声明 当成了表达式(赋值声明),并且在对于是否应看作是全局声明, 也存在分歧异议,并没有统一标准。

结论:

1.永远不要把函数定义在条件判断中!!!!!

2.学无止境,不要轻易谈“精通”!!!!

 

标签:浏览器,21,学海无涯,return,520,console,学无止境,log
来源: https://www.cnblogs.com/meijifu/p/12706957.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有