JavaScript的变量和作用域

JavaScript的变量和作用域
函数外声明:全局变量
函数内声明:局部变量


注意:如果在函数中创建局部变量时未写var关键字,则为全局变量


变量提升:
1、javascript的变量声明会被提升到它们所在函数的顶部。而初始化仍在原来的地方
2、JavaScript并没有重写代码;每次调用函数时,声明都会重新提升

function prison () {
	console.log(prisoner);//undefined
	
	var prisoner = 'Now I am dedined';
	
	console.log(prisoner);//Now I am dedined
}
prison();

高级变量提升和执行环境对象

JavaScript引擎工作步骤:
第一轮:初始化变量
1、声明并初始化函数参数
2、声明局部对象,包括将匿名函数赋给一个局部变量,但并不初始化它们
3、声明并初始化函数
第二轮:执行代码

声明并初始化函数参数 

function myFunction( arg1, arg2 ) {	
	//声明局部对象,包括将匿名函数赋给一个局部变量,但并不初始化它们
	var local_var = 'foo'
	var a_function = function () {
		console.log('a_function ')
	};
	//声明并初始化函数
	function inner() {
		console.log('inner')
	}
}
myFunction(1, 2)

注:在第一轮中,局部变量并未被赋值,因为可能在代码执行之后才能确定它的值,而第一轮不会执行代码 
 函数参数被赋值了,因为在向函数传递参数前,任何决定参数值得代码都已经执行了


变量在声明前是未定义的:

var regular_joe = 'regular_job is assigned'
function prison() {
	//undefined		regular_joe的声明会提升到函数的顶部,在查找全局作用域中的regular_joe之前会检查被提升的声明
	//但是如果regular_joe当做参数传入函数,那么它在声明前就有值了
	console.log(regular_joe)
	var regular_joe
}
prison()


变量在声明前有值:

var regular_joe = 'regular_joe is assigned'
function prison( regular_joe ) {
	//the regular_joe argument		在第一轮函数参数会被赋值
	console.log( regular_joe ) 
	var regular_joe
	//the regular_joe argument		在第一轮函数参数会被赋值,上面的声明是多余的
	console.log( regular_joe )
}
prison( 'the regular_joe argument' )



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值