今天在群里看到大家讨论两段代码,本来以为没什么大不了,简单的作用域问题而已,结果一执行,发现简直颠覆了自己的认知。 先献上代码,请仔细看:
-
代码片段1:
{ function a(){}; a = 10; } console.log(a) //执行结果:ƒ a(){} -
代码片段2:
{ a = 10; function a(){}; } console.log(a) //执行结果:10 -
代码片段2:
{ var a = 10; function a(){}; } console.log(a) //执行结果:变量重复报错!
是不是觉得很神奇? 这里有个很关键的点:
- 块级作用域里面,不能 var 和 function 同时声明一个变量会报错。
- 块级作用域里面声明了一个函数,global 里面也会声明一个同样的,有两份。这里要注意不是绝对会在global里面,需要看当前的静态位置,是在这个花括号外的一层作用域里。
- 如果一个window上的变量已经被定义了,那么再定义函数就会失效。 看代码:
{
function a(){};
a = 10;
window.a = 10//把全局的a也给改了
}
console.log(a)
//执行结果:10
可能不在global的演示:
function foo() {
var a = 1
let b = 2
{
let b = 3
var c = 4
let d = 5
function dd(){}
dd = 666
// debugger
console.log(dd)
}
console.log(dd)//我的另一份在这里
}
foo()