JavaScript中作用域问题讨论及示例代码探究
admin
2024-03-07 18:11:25
0

文章目录

  • 作用域
    • 1 函数作用域
    • 2 作用域链
    • 3 练习

作用域

  • 作用域指的是一个变量的可见区域
  • 作用域有两种:
    • 全局作用域
      • 全局作用域在网页运行时创建,在网页关闭时销毁
      • 所有直接编写到script标签中的代码都位于全局作用域中
      • 全局作用域中的变量是全局变量,可以在任意位置访问
    • 局部作用域
      • 块作用域
        • 块作用域是一种局部作用域
        • 块作用域在代码块执行时创建,代码块执行完毕它就销毁
        • 在块作用域中声明的变量是局部变量,只能在块内部访问,外部无法访问

1 函数作用域

  • 函数作用域也是一种局部作用域
  • 函数作用域在函数调用时产生,调用结束后销毁
  • 函数每次调用都会产生一个全新的函数作用域
  • 在函数中定义的变量是局部变量,只能在函数内部访问,外部无法访问
function fn(){let a = "fn中的变量a"console.log(a)
}fn()
console.log(a) // undefined 

2 作用域链

当我们使用一个变量时,JS解释器会优先在当前作用域中寻找变量,就近原则

  • 如果找到了则直接使用
  • 如果没找到,则去上一层作用域中寻找,找到了则使用
  • 如果没找到,则继续去上一层寻找,以此类推
  • 如果一直到全局作用域都没找到,则报错 xxx is not defined

参照下面的例子理解

报错的原因看下一节提升相关概念

let a = 10{console.log(a) // 报错,Cannot access 'a' before initializationlet a = "第一代码块中的a"console.log(a) // "第一代码块中的a"{console.log(a) // 报错,Cannot access 'a' before initializationlet a = "第二代码块中的a"console.log(a) // "第二代码块中的a"}console.log(a) // "第一代码块中的a"
}
console.log(a) // 10
let b = 33function fn() {console.log(b) // 报错,Cannot access 'b' before initializationlet b = 44console.log(b) // 44function f1() {console.log(b) // 报错,Cannot access 'b' before initializationlet b = 55console.log(b) // 55}f1()
}fn()

3 练习

练习1

var a = 1function fn() {a = 2console.log(a) // 2
}fn()
console.log(a) // 2

练习2

var a = 1function fn() {console.log(a) //undefinedvar a = 2console.log(a) // 2
}fn()
console.log(a) // 1

练习3

var a = 1function fn(a) {console.log(a) //undefineda = 2 	// 修改的是形参console.log(a) // 2
}fn()
console.log(a) // 1

练习4

var a = 1function fn(a) {console.log(a) //10a = 2console.log(a) // 2
}fn(10)
console.log(a) // 1

练习5

var a = 1function fn(a) {console.log(a) //1a = 2console.log(a) // 2
}fn(a)
console.log(a) // 1

练习6

console.log(a)  // a指向的是第五行的函数,var只是声明,并不赋值,如果声明过不会重复赋值var a = 1
console.log(a) // 1
function a() {alert(2)
}
console.log(a) // 1
var a = 3
console.log(a) // 3
var a = function () {alert(4)
}
console.log(a) // 打印11行函数
var a	// 已经声明过了,根本不执行
console.log(a) // 打印11行函数

相关内容

热门资讯

原创 曾... 2026年2月,一个名叫张曦的中国男人,带领团队准备收购“澳洲牙科材料龙头”SDI,出价近8.16亿...
做完心脏支架,不是万事大吉!真... 很多患者和家属都有一个误区:心脏支架做完,血管通了,病就好了,药可以少吃,生活可以照旧。 作为常年做...
原创 苹... 继苹果被罚380亿美金后,这次轮到法国酒业巨头。 把印度做成了全球最大的单一市场之后,印度杀猪盘最...
押注海外市场!小鹏汽车目标五年... 今年一季度受到市场竞争压力及春节等影响,中国汽车市场整体销量出现同比下滑,此基础下,小鹏集团(下称“...
突发!两家A股公司被证监会立案 上述公告中并未披露本次立案的具体缘由,不过查阅鼎际得已披露的公告,2025年7月该公司曾收到上海证券...
一键问诊 歇脚就医 市总工会智... 点蓝色字关注“七台河发布” 户外劳动者借助智慧远程医疗设备检查身体 近日,市总工会深耕职工服务阵地...
对话XREAL徐驰:AR眼镜创... 4月1日晚间,AR眼镜公司XREAL正式向港交所提交上市申请书,冲刺全球AR眼镜第一股。当时,对于X...
“2026 ESG与高质量发展... 5月29日,广东时代传媒集团主办的“2026 ESG与高质量发展创新论坛”在北京成功举行,本届论坛主...
助企融资1000万元!成都市首... 5月29日,邛崃市首本取水权不动产抵押登记证明正式颁发,这也是成都市首本取水权不动产登记证明,标志着...
给3亿人按过脚,足疗龙头想上市 来源:市场资讯 来源:雷达Finance 雷达财经出品 文|丁禹 编|孟帅 从济南街头一家面积不足...
金价“上蹿下跳”!现在到底该抄... 大家最近有没有发现,金价上蹿下跳的,昨天可能还是大阳线拔地而起,也有可能今天就变成一根大阴线砸穿支撑...
龙虎榜 | 上塘路、温州帮拉板... 5月28日,沪指涨0.12%,深证成指涨0.8%,创业板指涨1.96%。全市场成交额2.99万亿元,...
2连板ST洲际:控股股东广西正... 针对股票异常波动情况,公司进行了全面核查。首先,经公司自查,公司日常经营活动正常,市场环境、行业政策...
原创 吹... 据凤凰网5月27日报道,“2026凤凰湾区财经论坛·金融峰会”在深圳举行,全球化智库副主任高志凯在峰...
陈峻齐:黄金止跌深V能否延续 来源:市场资讯 5月29日,昨日周四,黄金市场早盘持续承压下行,价格一路走低跌破4400关口至436...
A股收评:放量下跌!创业板指跌... 5月29日,A股三大指数集体下挫,截至收盘,沪指跌0.73%报4068点,深证成指跌1.81%,创业...
腾讯云数据库面向 Agent ... 5 月 29 日,腾讯云宣布旗下数据库产品体系面向 Agent 场景全面升级,能够为 Agent 应...
国产存储双雄冲刺资本市场,A股... 本报(chinatimes.net.cn)记者卢晓 北京报道 身处全球存储芯片超级周期,国内存储巨头...
每日经济新闻社会责任报告(20... 一、前言 (一)基本情况 每日经济新闻创刊于2004年,是由国家新闻出版总署批准成立的一张全国公开...