JS基础--作用域


一、作用域是什么?

含义:在JavaScript中,作用域为可访问变量,对象,函数的集合,它分为局部作用域和全局作用域。

如何理解:
函数和变量在哪些地方可以被访问 那些地方就是它的作用域。
作用域只有函数才有 代码块和对象的大括号没有作用域
函数外部称为外部作用域
函数内部称为内部作用域
js引擎规则:函数内部的代码可以访问内部的变量和函数 也可以访问外部的变量和函数
函数外部的代码 不能访问函数内部的变量和函数

二、JavaScript 局部作用域

函数和变量在函数内声明,变量为局部变量,函数为局部函数,都具有局部作用域。
局部变量或局部函数:只能在函数内部访问。
因为局部变量或局部函数只作用于函数内,所以不同的函数可以使用相同名称的变量和函数。
案例:

	function fn (a) {
				  var a=300
				  a=100
				  function a(){}
				}
				var a=200;
				fn(300)
				console.log(a)   //这里打印200,函数内部的变量a和函数a只作用于函数体内

三、JavaScript 全局作用域

变量或函数在函数外定义,即为全局变量或全局函数。
全局变量或全局函数有 全局作用域: 网页中所有脚本和函数均可使用。
如果变量在函数内没有声明(没有使用 var 关键字),该变量为全局变量。
案例:

	function fn () {
				  a=100
				}
				var a=200;
				fn(300)
				console.log(a)   //这里打印的就是100;因为函数体内的a没有用var声明也没有形参隐式声明,所以会找到外部的全局变量a然后修改

四、JavaScript 隐式提升

什么是隐式提升:
一个变量可以先使用在声明,因为每一个作用域在运行代码时,
会先扫描这个作用域代码中的所有var和function关键字 然后提前声明 再运行代码
比如:

console.log(a);//不会报错  因为隐式的提前声明了变量a,但是访问的值是undfined,因为变量只隐式提升声明
var a=100;
fn()//正常调用函数 因为隐式的提前声明了函数fn  函数的提升会把代码块一起提升
function fn(){}

隐式提升顺序是什么:
四个字:形实函运
解释:
1.先把函数内部的形参和局部变量提前声明
2.再把实参赋值给形参变量
3.然后再把内部的局部函数 提前声明
4.再按照代码顺序执行代码(执行的过程中 这个作用域内部有已经隐式提前声明的变量和函数就不再声明了

案例:

var a=100
		function fn(a){			   //在函数体内根据形实函运顺序,首先提前声明了 var a;  再实参赋值 a=100, 
		                           //然后提前声明函数 function  a () {console.log(666666)} 注意这里函数不会运行,没有调用。
		                           //最后再按照代码顺序执行。
			console.log(a)         // var a; a=100;function  a () {console.log(666666)};放到了console.log(a)前面。
			                       //这里优先级是依靠就近原则  所以这里打印 function a(){console.log(666666)}
			a=10                   // var a=10
			console.log(a)         // 打印10
			var a=20               // var a=20
			console.log(a)         // 打印20
			function  a () {
				console.log(666666)
			}
			console.log(a)		   // 打印20
		}
		fn(a)                       
		console.log(a)	           //因为局部变量不会被函数外部访问所以,这里打印全局变量a; 打印100

五、函数调用 运行时的作用域

函数在声明和定义时就有了它的作用域 ,但是函数的调用可能发生在其他作用域,
运行代码时 一定是去它声明和定义的作用域执行代码

案例:

function fn(){                                       
  var a=10
  return function fm(){console.log(a)}
}
var a=20
fn()()       //fn()()解释:调用fn函数 运行后结果返回fm()函数 再次调用就是调用fm函数 打印变量a
              /* 这里fm函数是fn函数的局部函数 ,虽然是在全局作用域调用运行fm函数,
                 但是fm函数定义的作用域在fn内部  因此执行代码的作用域在fn内部 */
                //结果打印的不是全局变量a ,而是fn函数内部的a ;打印10
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
引用\[1\]提到了函数的命名规则和参数的使用方式。函数的名字首字母必须大写,而函数的参数在函数体内使用时需要加上前缀"a:"。这样做是为了避免用户自定义函数与内置函数命名冲突,并且在使用函数参数时避免出现未定义的变量错误。此外,函数名称属于全局命名空间,在所有脚本都可以使用。而引用\[2\]提到了作用域的概念,函数内部的代码环境称为局部作用域或函数作用域。在函数内部定义的变量只能在该函数内部使用。另外,JavaScript没有块级作用域的概念,即在if语句、循环语句创建的变量可以在整个函数内部使用。引用\[3\]提到了函数提升的概念,即函数的声明会被提升到当前作用域的最上面,但不会立即调用函数。这意味着可以在函数声明之前调用函数。另外,函数表达式的声明方式需要注意,需要先声明函数变量再调用函数。根据以上引用内容,作用域首选项名称指的是在函数内部定义的变量的名称。 #### 引用[.reference_title] - *1* [VimScript脚本语言学习------变量作用域、函数](https://blog.csdn.net/smstong/article/details/20775695)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Javascript基础第六天知识点以及案例:作用域JS预解析、对象](https://blog.csdn.net/m0_46597922/article/details/105752076)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

H5_ljy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值