【 总结 】作用域

全局作用域

  • 全局作用域在页面打开时被创建,关闭时被销毁
  • 全局对象window
  • 全局作用域中声明的变量和函数会作为window对象的属性和方法保存

函数作用域

  • 调用函数时 函数作用域被创建 函数执行完毕 函数作用域被销毁
  • 每调用一次函数就会创建一个新的函数作用域 相互独立
  • 在函数作用域中可以访问到全局作用域的变量 在函数外部无法访问函数作用域内部的变量
  • 在函数作用域中访问变量、函数时 会现在函数作用域内寻找 如果没有 就会到函数的上一级作用域查找 一直找到全局作用域

作用域的深层次理解

执行期的上下文

  • 当代码执行的前期,创建一个执行期的上下文的内部对象AO(作用域)
  • 这个内部的对象是预编译的时候创建的 因为当函数被调用的时候 会先进行预编译
  • 在全局代码执行的前期会创建一个执行期的上下文对象GO

函数作用域的预编译

  • 创建AO对象 AO{ }
  • 找形参和变量声明 将变量和形参名 作为AO对象的属性名 值为undefined
    • 实参和形参的值统一
  • 函数声明 值赋予函数体
    函数声明 function fn( ){ }
    函数表达式 var a = function ( ){ }

全局作用域的预编译

  • 创建GO对象
  • 找变量声明 将变量名作为GO对象的属性名 值是undefined
  • 函数声明 值赋予函数体
    函数声明 function fn( ){ }
    函数表达式 var a = function ( ){ }

练习题

	function fn(a,c){
			console.log(a); // function a(){}
			var a = 2;
			console.log(a); // 2
			console.log(c); // function c(){}
			function a(){}
			if(false){
				var d = 678
			}
			console.log(d) // undefined
			console.log(b) // undefined
			var b = function(){}
			console.log(b) // function (){}
			function c(){}
			console.log(c) // function c(){}
		}
	fn(1,2)
AO{
  a undefined 1 function a(){}
  c undefined 2 function c(){}
  d undefined
  b undefined
}

====================================================================================

		var a = 10
		b = 20
		function test (a, b) {
			console.log(a, b, test1, d) // 1 undefined test1(){} undefined 
			var a = 10 // 重新给a 赋值
			console.log(a) // 10
			if (b) {
				var c = 20
			}
			console.log(a, b, test1, d) // 10 undefined test1(){} undefined 
			function test1 () {}
			var d = function () {} // 重新给d赋值
			console.log(a, b, test1, d) //10 undefined test1(){} function() {} 
		}
		test(1)
		GO{
           a undefined 10
           test:function(){}
           b 10
           AO{
           	 a undefined 1 10
           	 b undefined
           	 c undefined
           	 d undefined function(){}
           	 test1 function(){}
           }
		}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值