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 true2分析
首先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 并没有声明在一块,却可以访问,这是引擎做的事情。引擎首先给函数环境添加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只不过不是块作用域。
- <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指针指向一层一层的向上找(搜索机制)。
原文参考自站长网http://www.software8.co/