Javascript 作用域与this的用法

1 现象

<SCRIPT LANGUAGE="JavaScript">
	var list=[1,2,3];
	function show(){
		document.write("list :"+list+"</br>");
		if(typeof list=="undefined"){
			var list = [1];
			// alert("Function show:"+list.length);
			document.write("Function show:"+list.length+"</br>");
			document.write("this list:"+this.list.length+"</br>");
			document.write(this.list===window.list);//  true
		}
	}
	show();
</SCRIPT>
 

运行结果:

 list :undefined
 Function show:1
 this list:3
 true

2分析

首先Global对象的中创建list数组,这个list在浏览器里面的宿主环境也就是window对象。 从运行结果我们看到函数show() 里面的list对象添加到了函数环境,而不能说是覆盖,因为window.list依然没变,全局环境的Global有自己的list对象,函数只是他的属性或者方法,函数里的list对象与Global的对象不同。调用show() 是在全局环境调用即是window环境,所以show()方法里面的this指向的是window.

3 脚本引擎的活动

在请求调用一个函数的时候,脚本引擎会先出场,然后再去调用脚本引擎的代码。脚本引擎到底做了什么事情呢。运行结果我们看到 list :undefined 而经过前面分析  list 不是window的对象。先这一段代码

<SCRIPT LANGUAGE="JavaScript">
	function show(){
		document.write("list :"+list+"</br>");
		if(true){
			var list = [1];
		}
		document.write("list:"+list.length+"</br>");
	}
	show();
</SCRIPT>

 结果:

list :undefined
list:1

这里看到list.length 并没有声明在一块,却可以访问,这是Javascript引擎做的事情。引擎首先给函数环境添加list变量。 指向undefined。

引擎处理的代码是:

<SCRIPT LANGUAGE="JavaScript">
	function show(){
		var list;
		document.write("list :"+list+"</br>");
		if(true){
			list = [1];
		}
		document.write("list:"+list.length+"</br>");
	}
	show();
</SCRIPT>
 

脚本引擎总是把声明放在函数的最前面。最后才是真正的执行函数。

过程:请求执行函数-->脚本引擎做一些事情-->执行函数

Javascript是有作用域的,但是与Java的作用域不同,Java的作用域都是在一个代码块里面起作用,Javascript只不过不是块作用域。<Javascript高级程序设计>一书称为环境作用域(全局环境作用域和函数环境作用域)

Javascript不是块作用域类型:

<SCRIPT LANGUAGE="JavaScript">
	function show(){
		document.write("list :"+list+"</br>");
		if(true){
			if (true) {
				if (true) {
					var list = [1];
				};
			};
		}
		document.write("list:"+list.length+"</br>");
	}
	show();
</SCRIPT>

 3 this

  想知道this是什么,只需要知道谁在调用它即可,谁调用它,他就是谁。对于原型链也是一样的,只不过它的prototype指针指向一层一层的向上找(搜索机制)。

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值