-
Notifications
You must be signed in to change notification settings - Fork 3.3k
第 41 题:考察作用域的一道代码题 #61
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
依次输出:undefined -> 10 -> 20 解析: 在立即执行函数中, 由于变量声明提升, |
undefined,10,20。用var生命的变量存在变量提升,a在作用域里提前声明,但是没有定义,第一个输出undefined,a = 5,定义a的值,局部作用域修改为5,但是window全局对象下的a变量没有改变,输出10,最后var a = 20,给局部作用域赋值,输出20. |
执行解析步骤: |
执行代码步骤
|
var a = 10;
(function () {
console.log(a);
a = 5;
console.log(window.a);
var a = 20;
console.log(a);
})();
// ===
var a = 10;
(function () {
var a;
console.log(a); // undefined
a = 5;
console.log(window.a); // 此时是window.a => 10
a = 20;
console.log(a); // 20
}); |
var a = 10; |
1,变量提升;2,window.a 为 10 |
undefined 10 20 首先这段代码有两个作用域,window和function。在function作用域内,同样存在变量提升,当第一次console时,这时变量a只定义未赋值,所以打印undefined。在window作用域中,a的值为10,所以window.a的值为10。最后一次打印之前,a被赋值为20,所以打印结果为20。 问题: |
如果看的懂的话我就不解释了,如果还看不懂的话我在解释 |
懂的 |
运行了一下,打印结果报错:Uncaught TypeError: "123" is not a function。 还是没有很理解,求详细解释~ |
undefined undefined 20, try it! |
这一段是否可以理解为
因为没有加var 所以为global作用域声明提升,而不是函数作用域声明提升。 |
@Yana5417 可能并没有说清楚吧。
我们都知道window是一个全局对象,在我的例子中①是假象出来的,为的是让你看到window的作用域,及全局作用域,然后下来是②,它是一个函数作用域
1、函数作用域可以访问全局作用域
步骤解析:
2、全局作用域中无法访问局部作用域的变量
步骤解析:
3、当局部作用域中进行隐式声明时,默认会在全局作用域中声明该变量
这次应该可以看明白了吧! |
明白了,非常感谢🙏 |
为什么window.a的值不是10而是5了 |
a=5是局部变量吧 |
明白了a快速执行函数内没有声明,所以赋值到全局变量了 |
var a = 10;
(function () {
console.log(a)
a = 5
console.log(window.a)
var a = 20;
console.log(a)
})();
// 前提浏览器中执行,node中window.a会报错 window is not defined
// undefined 函数中的a,先会找函数中是否存在该变量,因为存在声明前置,所以这里的第一个a为undefined
// 10 指定了是window上的a变量,说明是函数外部的a
// 20 此时函数内的a已经赋值为20了,所以输出为20。可以转为如下代码
window.a = 10;
(function() {
var a;
console.log(a);
a = 5;
console.log(window.a);
a = 20;
console.log(a);
})(); |
a 不是全局变量吗?? |
undefined undefined 20 中间的自定义属性,未赋值 (个人理解 ) |
window.a是个坑 |
在js使用了模块导入的方式下,输出的结果是undefined,undefined,20。有大佬知道是为什么吗 |
我感觉这得非情况讨论吧: |
undefined 10 20 第一 undefined因为函数内部声明过a, 导致变量提升,但不负值,返回undefined。如果内部没有声明a 则作用域继续向外查找,找到a= 10:
第二 10参照第四点直接读取全局变量 a=10 第三 20常规作用域查找,a=20 |
是因为第一句var a=10;中的a 不是挂载在window上的 ,所以立即执行函数中的 window.a的值是 undefined |
var a = 10;
(function () {
console.log(a) // undefined
a = 5
console.log(window.a) // 10
var a = 20;
console.log(a) // 20
})() |
var a = 10;
(function () {
console.log(a)
a = 5
console.log(window.a)
var a = 20;
console.log(a)
})() |
|
如果在浏览器console执行的话, 第三行末尾没有分号"; " 认为执行的是 var a = '123'(自执行函数), 把'123' 当function了,所以会报错. |
这里关键点是变量提升,代码等价于
|
借用楼上解释:如果把var a=20注释掉,那么a只有在外部有声明,显示的就是外部的A变量的值了。结果A会是10 5 5 |
分别为undefined 10 20,原因是作用域问题,在内部声名var a = 20;相当于先声明var a;然后再执行赋值操作,这是在IIFE内形成的独立作用域,如果把var a=20注释掉,那么a只有在外部有声明,显示的就是外部的A变量的值了。结果A会是10 5 5
The text was updated successfully, but these errors were encountered: