前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JS作用域

JS作用域

作者头像
云叶知秋
发布2023-12-23 09:49:00
930
发布2023-12-23 09:49:00
举报
文章被收录于专栏:Unity3D学习笔记Unity3D学习笔记

JavaScript的作用域有全局作用域和局部作用域

先通过一下代码来体验下作用域

代码语言:javascript
复制
var x = 1;
function f1(){
    var y = 2;
    x = 10;
    console.log(x);
}
console.log(y);		//undefined

上面的代码运行后我想大家应该猜到了结果就是undefined

就是报如下的错误,也就是y是个未定义的变量

VM42:7 Uncaught ReferenceError: y is not defined at :7:13

上述代码中变量x就是全局作用域,方法f1的作用域也是全局,f1方法中的变量y是局部的,y的作用范围仅限f1方法体内,离开了f1的方法体的作用范围,就无法获取到y的值,所以上述的例子中最后打印y的时候是undefined

我们再来看下面的例子

代码语言:javascript
复制
var a = 1;
function f1(){
    console.log(a);		//1
    a = 3;
}
f1();
console.log(a);			//3

上述代码能正常运行,首先全局变量a对于f1方法体是可见的,在f1方法体内对全局变量a进行赋值,修改为3,所以f1()方法执行完毕后输出a的值是3,上面这段代码相对大家应该都比较容易

接下来再看看下面的例子

代码语言:javascript
复制
var a = 1;
function f1(){
    console.log(a);
    var a = 3;
}
f1();
console.log(a);

这段代码会怎么输出呢?运行结果如何呢?

结果如下

代码语言:javascript
复制
undefined
------------------------------------------------------------------------------------------------------------
1

是不是跟大家想的不一样,让我们来分析一下这段代码的预解析过程

1)首先定义了一个全局变量a

2)定义了function f1

3)执行f1方法

​ 3-1)定义了f1方法体内部的局部变量a,a的值为undefined

​ 3-2)输出局部变量a,因为a未赋值,所以这个地方输出undefined

​ 3-3)给局部变量a赋值为3

4)输出全局变量a,a的值为1

这就是上面这段代码的预解析过程,只要把这段代码的预解析搞明白了,就能猜到他的结果输出了

接下来用一道面试题来举个例子

代码语言:javascript
复制
var a = 10;
function f1(){
    var b = 2*a;
    var a = 20;
    var c = a+1;
    console.log(b);
    console.log(c);
}
f1();

上面例子的输出结果是什么呢?读者先自己推算推算

我们先看一下运行结果

代码语言:javascript
复制
NaN
------------------------------------------------------------------------------------------------------------
21

结果有没有跟你想的一样呢?不管怎样我们来对上述代码进行一下预解析,

代码语言:javascript
复制
1)定义全局变量a
2)定义全局函数f1
3)给全局变量a赋值为10
4)运行f1
	4-1)定义局部变量b,当前b的值为undefined
    4-2)定义局部变量a,当前a的值为undefined
    4-3)定义局部变量c,当前c的值为undefined
    4-4)给局部变量b进行赋值,使用2*a表达式的结果进行赋值,由于a的值为undefined,所以b的值为NaN(Not a Number)
    4-5)给局部变量a赋值为20
    4-6)给局部变量c进行赋值,使用a+1表达式的结果进行赋值,由于上一步局部变量a的值为20,所以a+1的表达式的值为21

大家学会了吗?

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-12-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档