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