javascript--词法分析

本文探讨JavaScript中变量的作用域、词法分析及其对变量查找的影响。通过具体实例讲解函数内部如何查找变量,以及词法分析期与运行期的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >




<!DOCTYPE html>
<html>
<head>
	<title></title>
<script type="text/javascript">
/*作用域 解释:变量的作用域在自己所在的这个函数*/
/*
var a=1;
function t1(){
	var b=2;
	function t2(){
		var c=3;
		alert(a+b+c);
	}
	t2();
}
t1();*/

//  ==6  函数嵌套很普遍 首先变量函数里寻找 找不到再到外层 直到最外层




/*
Q 	var 函数里什么时候要加
A 	var是在函数运行的上下文中声明一个变量
没加var 仅仅是赋值操作  但不要狭隘的理解为全局
*/

/*alert(window.d);//undefied
alert(window.e);//und
function t(){
	d=5;
	//赋值操作 函数内找不到var(声明操作) 直到最外层, 写了个全局 window.d=5;
	var e=6;//var 函数内的变量,在全局内声明就是全局,这里是函数里声明
}
t();

alert(window.d);//5
alert(window.e);//und
*/




/*
Q	一个加window.d 一个不加win,什么区别
A   用一个没有的变量测试,有win的引用全局变量时,是作为某个属性不存在返回un
	不加win 是报 xxxis not und ,上面一个轻微一点 */
/*function t1(){
	var d;
	function t2(){
		d=5;//这边赋值,往外找,在t1找到
		e=6;//同上面一个例子 全没找到,就写了个全局
	}	
	t2();
}
t1();
console.log(e);// == 6 因为写下面的下面就报错不执行下去了
console.log(window.d);//und 
console.log(d);//因为全局 所以is not defied
*/




/*var加不加对找不到这个变量的影响和加不加win类似*/
var str1='tama';
function t1(){
	console.log(str1);//存在的变量  打印变量
	console.log(str2);//执行到这行时 在函数t1内找没, 又到外层全局寻找str2   
	str2 = 'beef';//到这行 才把全局赋上值,如果上下两行颠倒就能显示出来了

	var str2= 'bee';
}
t1();
//tama  beef   is not defied
// tama bee   undefied




</script>
</head>


<body>

</body>
</html>

为什么会有undefied和is not defined区别呢




这就要引出这个了----词法分析

js代码自上而下执行
但是在整体运行分:
词法分析期
运行期
自上而下执行之前,先有一个词法分析过程 就是下面说的

js里的函数运行解析
0.函数运行前 生成 Active Object(活动对象,缩写AO)
从函数的三个看:参数(函数名后括号里的),变量声明(有var的),函数声明(function)
1.参数 形成AO的属性,值为undefined,如有==那个值
2.变量 同上 但若已存在,则不改变
3.函数 例:function foo(){}  赋给foo属性,若已存在,则覆盖


function a(b){
	alert(b);

	function b(){
		alert(b);
	}
	b();
}

a(1);
/*词法分析
ao.b=und  1
alert也算var 因为已存在不改
b() ao.b=func b....

运行期 依次alert,没有其他变化,所以两次alert都是func*/



function a(b){
	// alert(b);
	var b=1;

	function b(){
		alert(b);
	}
	b();
}

a(1);

/*
alert 改为var b=1
词法分析期不变 
运行期 赋值操作 把函数用1代替了 运行的话,会说b()不是function type 把alert放在1那行后面就能看到打印为1*/



function a(b){
	alert(b);
	b=function b(){
		alert(b);
	}
	b();
}
a(1);
/*词法分析
ao.b= 1 
alert也算var 因为已存在不改
只有这两行,没有函数

运行期
alert    1
b= ...   赋值 b为函数 
*/



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值