第 41 题:考察作用域的一道代码题
分别为 undefined 10 20,原因是作用域问题,在内部声名 var a = 20; 相当于先声明 var a; 然后再执行赋值操作,这是在IIFE内形成的独立作用域,如果把 var a=20 注释掉,那么 a 只有在外部有声明,显示的就是外部的 A 变量的值了。结果 A 会是 10 5 5
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(15)
@Yana5417 可能并没有说清楚吧。
我们都知道window是一个全局对象,在我的例子中①是假象出来的,为的是让你看到window的作用域,及全局作用域,然后下来是②,它是一个函数作用域
1、函数作用域可以访问全局作用域
步骤解析:
2、全局作用域中无法访问局部作用域的变量
步骤解析:
3、当局部作用域中进行隐式声明时,默认会在全局作用域中声明该变量
这次应该可以看明白了吧!
明白了,非常感谢
这一段是否可以理解为
因为没有加var 所以为global作用域声明提升,而不是函数作用域声明提升。
undefined undefined 20, try it!
运行了一下,打印结果报错:Uncaught TypeError: "123" is not a function。
还是没有很理解,求详细解释~
懂的
如果看的懂的话我就不解释了,如果还看不懂的话我在解释
undefined 10 20
代码执行过程:
var a; // undefined
a = 10;
(function () {
var a; // undefined
console.log(a)
a = 5
console.log(window.a)
a = 20;
console.log(a)
})()
首先这段代码有两个作用域,window和function。在function作用域内,同样存在变量提升,当第一次console时,这时变量a只定义未赋值,所以打印undefined。在window作用域中,a的值为10,所以window.a的值为10。最后一次打印之前,a被赋值为20,所以打印结果为20。
问题:
其实在这里,我不是很理解window和function这两个作用域之间的关系,希望能看到详细的解说~~~
1,变量提升;2,window.a 为 10
var a = 10;
(function () {
console.log(a) //undefined 变量提升 这之前 var a
a = 5 //全局变量
console.log(window.a) // 5 这里我有问题 10
var a = 20; // a =20
console.log(a) //20
})()
执行代码步骤
执行解析步骤:
var a = undefined;
a = 10;
(function () {
// 变量提升(预解析)
var a = undefined;
console.log(a); // 输出undefined
a = 5;
console.log(window.a); // 找window(全局)对象的a, 输出10
a = 20;
console.log(a); // 输出20
})()
undefined,10,20。用var生命的变量存在变量提升,a在作用域里提前声明,但是没有定义,第一个输出undefined,a = 5,定义a的值,局部作用域修改为5,但是window全局对象下的a变量没有改变,输出10,最后var a = 20,给局部作用域赋值,输出20.
依次输出:undefined -> 10 -> 20
解析:
在立即执行函数中,
var a = 20;
语句定义了一个局部变量a
,由于js的变量声明提升机制,局部变量a
的声明会被提升至立即执行函数的函数体最上方,且由于这样的提升并不包括赋值,因此第一条打印语句会打印undefined
,最后一条语句会打印20
。由于变量声明提升,
a = 5;
这条语句执行时,局部的变量a
已经声明,因此它产生的效果是对局部的变量a
赋值,此时window.a
依旧是最开始赋值的10
,