JS基础--作用域

JS基础--作用域,第1张

文章目录 一、作用域是什么?二、JavaScript 局部作用域三、JavaScript 全局作用域四、JavaScript 隐式提升五、函数调用 运行时的作用域


一、作用域是什么?

含义:在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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/926128.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存