第 41 题:考察作用域的一道代码题

发布于 2022-08-17 12:17:21 字数 150 浏览 443 评论 15

分别为 undefined 10 20,原因是作用域问题,在内部声名 var a = 20; 相当于先声明 var a; 然后再执行赋值操作,这是在IIFE内形成的独立作用域,如果把 var a=20 注释掉,那么 a 只有在外部有声明,显示的就是外部的 A 变量的值了。结果 A 会是 10 5 5

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(15

沦落红尘 2022-05-04 13:57:02
(function(){ // ①
  var window = this
  var a = '123'
  (function(){ // ②
    var a = '234'
    console.log(window.a)
    console.log(this.a)
  }())
}())

@Yana5417 可能并没有说清楚吧。

作用域

我们都知道window是一个全局对象,在我的例子中①是假象出来的,为的是让你看到window的作用域,及全局作用域,然后下来是②,它是一个函数作用域

关系

1、函数作用域可以访问全局作用域

var a = 123;
(function(){
  console.log(a) // 123
  a = 456
}());
console.log(a) // 456

步骤解析:

var a = undefined;
a = 123;
(function(){
  console.log(a) // 函数作用域寻找变量a
  console.log(window.a) // 结果没找到,那么他会向上寻找,直到找到该变量,若最后没有找到,那么就会报该变量未定义
  window.a = 456 // 因为找到的是window的变量`a`所以此处会修改window的变量`a`
}());
console.log(a) // 456
在这里实际还涉及到隐式声明,所以我在下面会说明

2、全局作用域中无法访问局部作用域的变量

(function(){
  var a = 456
}());
console.log(a) // Error: a is not defined

步骤解析:

(function(){
  var a = 456
}());
console.log(a) // window已经是全局作用域了,在这里并没有发现变量`a`所以不会继续向上寻找,直接输出 a is not defined

3、当局部作用域中进行隐式声明时,默认会在全局作用域中声明该变量

(function(){
  a = 456
}());
console.log(a) // 456
// 局部变量捡到十块钱,然后找不到失主,然后全局变量说,那算了,找不到我就先拿着把。然后局部变量说,好吧,那就给你吧!

最后我们开始看你解析完后这道题

var window = this; // 再次声明此处可忽略,只是为了让你看到window是全局this的别名
var a; // undefined
a = 10; 
(function () {
var a; // undefined
console.log(a) //  此处因为是显式声明所以你在函数作用域中访问到的,一定是他内部声明变量`a`
a = 5 // 显式声明的变量`a` = 5
console.log(window.a) // 直接找的是`window`的`a`则不在函数作用域中寻找 有趣的是,`function`中不通过`call`或`apply`修改`this`指针,此处输出 `this.a` 的效果是一致的
a = 20;// 显式声明的变量`a` 由 5 变成 20
console.log(a)
})()

这次应该可以看明白了吧!

南街九尾狐 2022-05-04 13:57:02

明白了,非常感谢

夜夜流光相皎洁 2022-05-04 13:57:01
(function(){
  b = 5
})()

这一段是否可以理解为

var b;
(function(){
 b =5
})

因为没有加var 所以为global作用域声明提升,而不是函数作用域声明提升。

£噩梦荏苒ぐ 2022-05-04 13:56:59

undefined undefined 20, try it!

夏天碎花。小短裙 2022-05-04 13:56:36

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)
})()
首先这段代码有两个作用域,窗口和功能。在功能作用域内,同样存在变量提升,当第一次控制台时,这时变量一个只定义未赋值,所以打印未定义。在窗口作用域中,一个的值为10,所以window.a的值为10最后一次打印之前,一个被赋值为20,所以打印结果为20。
问题:
其实在这里,我不是很理解窗口和功能这两个作用域之间的关系,希望能看到详细的解说~~~

(function(){
  var window = this
  var a = '123'
  (function(){
    var a = '234'
    console.log(window.a)
    console.log(this.a)
  }())
}())

如果看的懂的话我就不解释了,如果还看不懂的话我在解释

运行了一下,打印结果报错:Uncaught TypeError: "123" is not a function。

还是没有很理解,求详细解释~

晌融 2022-05-04 13:55:50

懂的

好多鱼好多余 2022-05-04 13:54:05

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)
})()

首先这段代码有两个作用域,窗口和功能。在功能作用域内,同样存在变量提升,当第一次控制台时,这时变量一个只定义未赋值,所以打印未定义。在窗口作用域中,一个的值为10,所以window.a的值为10最后一次打印之前,一个被赋值为20,所以打印结果为20。

问题:
其实在这里,我不是很理解窗口和功能这两个作用域之间的关系,希望能看到详细的解说~~~

(function(){
  var window = this
  var a = '123'
  (function(){
    var a = '234'
    console.log(window.a)
    console.log(this.a)
  }())
}())

如果看的懂的话我就不解释了,如果还看不懂的话我在解释

烧了回忆取暖 2022-05-04 13:54:04

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这两个作用域之间的关系,希望能看到详细的解说~~~

愛上了。 2022-05-04 13:53:07

1,变量提升;2,window.a 为 10

∞琼窗梦回ˉ 2022-05-04 13:48:33

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
})()

夏末染殇 2022-05-04 13:45:47
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
});
“停滞” 2022-05-04 13:45:42
var a = 10;
(function () {
	console.log(a)
	a = 5
	console.log(window.a)
	var a = 20
	console.log(a)
})()

// undefined
// 10
// 20

执行代码步骤

  1. 变量提升
  2. 形参赋值
兰花执着 2022-05-04 13:12:38

执行解析步骤:
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
})()

寂寞美少年 2022-05-04 12:41:01

undefined,10,20。用var生命的变量存在变量提升,a在作用域里提前声明,但是没有定义,第一个输出undefined,a = 5,定义a的值,局部作用域修改为5,但是window全局对象下的a变量没有改变,输出10,最后var a = 20,给局部作用域赋值,输出20.

执手闯天涯 2022-05-03 08:33:50

依次输出:undefined -> 10 -> 20

解析:

在立即执行函数中,var a = 20; 语句定义了一个局部变量 a,由于js的变量声明提升机制,局部变量a的声明会被提升至立即执行函数的函数体最上方,且由于这样的提升并不包括赋值,因此第一条打印语句会打印undefined,最后一条语句会打印20

由于变量声明提升,a = 5; 这条语句执行时,局部的变量a已经声明,因此它产生的效果是对局部的变量a赋值,此时window.a 依旧是最开始赋值的10

~没有更多了~

关于作者

不奢求什么

暂无简介

文章
评论
27 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文