js作用域相关的一道题

今天有个伙伴问了我一个题目,题目如下:

var x = 10;
function fn() {
    console.log(x)
}

function show(f) {
    var x= 20
    (function(){
    f()
  })()
   
}
show(fn);

略作沉思,我的回答是20,小伙伴说是10 ,我昂,按照我的尿性我脑袋想的是四舍五入这段等于

var x = 10;
function show(f) {
    var x= 20;
     console.log(x)
}
show(fn);

但是其实不是这样的,于是我在想是不是因为匿名执行函数的作用域指向全局的原因呢?

但又不是

其实是因为,每个函数都有自己独立的执行环境,在代码完成的时候,就确定了自己的作用域,虽然这里的f被当作一个形参传递进了show中,但是人家f也是有风格的好吗,它还是得按自己得风格做事,也就是说,此处的f定义的时候是一个全局函数,那么它的作用域还是全局的,所以的话,这里的f会去找全局的x 也就是10,

那么如果我们的全局没有定义x变量会怎么样呢

function fn() {
    console.log(x)
}
function show(f) {
    var x= 20; 
    (function(){
    f()
  })() } show(fn);

 

 找不到全局x变量报错了

参考:https://blog.csdn.net/hahalalalalalala/article/details/107386666

 

原文地址:https://www.cnblogs.com/Ewarm/p/13678139.html