博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Javascript 作用域与this的用法
阅读量:5322 次
发布时间:2019-06-14

本文共 1830 字,大约阅读时间需要 6 分钟。

1 现象

Js代码: 
  1. <SCRIPT LANGUAGE="JavaScript">  
  2.     var list=[1,2,3];  
  3.     function show(){  
  4.         document.write("list :"+list+"</br>");  
  5.         if(typeof list=="undefined"){  
  6.             var list = [1];  
  7.             // alert("Function show:"+list.length);  
  8.             document.write("Function show:"+list.length+"</br>");  
  9.             document.write("this list:"+this.list.length+"</br>");  
  10.             document.write(this.list===window.list);//  true  
  11.         }  
  12.     }  
  13.     show();  
  14. </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的对象。先这一段代码

Js代码:  
  1. <SCRIPT LANGUAGE="JavaScript">  
  2.     function show(){  
  3.         document.write("list :"+list+"</br>");  
  4.         if(true){  
  5.             var list = [1];  
  6.         }  
  7.         document.write("list:"+list.length+"</br>");  
  8.     }  
  9.     show();  
  10. </SCRIPT>  

 结果:

list :undefined

list:1

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

引擎处理的代码是:
Js代码:  
  1. <SCRIPT LANGUAGE="JavaScript">  
  2.     function show(){  
  3.         var list;  
  4.         document.write("list :"+list+"</br>");  
  5.         if(true){  
  6.             list = [1];  
  7.         }  
  8.         document.write("list:"+list.length+"</br>");  
  9.     }  
  10.     show();  
  11. </SCRIPT>  

 

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

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

Javascript是有作用域的,但是与Java的作用域不同,Java的作用域都是在一个代码块里面起作用,Javascript只不过不是块作用域。

Javascript不是块作用域类型:
Js代码: 
  1. <SCRIPT LANGUAGE="JavaScript">  
  2.     function show(){  
  3.         document.write("list :"+list+"</br>");  
  4.         if(true){  
  5.             if (true) {  
  6.                 if (true) {  
  7.                     var list = [1];  
  8.                 };  
  9.             };  
  10.         }  
  11.         document.write("list:"+list.length+"</br>");  
  12.     }  
  13.     show();  
  14. </SCRIPT>  

 3 this

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

原文参考自站长网http://www.software8.co/

转载于:https://www.cnblogs.com/wwwroot/archive/2013/01/10/2855152.html

你可能感兴趣的文章
观察者模式(Observer)
查看>>
python中numpy.r_和numpy.c_
查看>>
egret3D与2D混合开发,画布尺寸不一致的问题
查看>>
freebsd 实现 tab 命令 补全 命令 提示
查看>>
struts1和struts2的区别
查看>>
函数之匿名函数
查看>>
shell习题第16题:查用户
查看>>
实验4 [bx]和loop的使用
查看>>
Redis常用命令
查看>>
2018.11.06 bzoj1040: [ZJOI2008]骑士(树形dp)
查看>>
2019.02.15 bzoj5210: 最大连通子块和(链分治+ddp)
查看>>
redis cluster 集群资料
查看>>
微软职位内部推荐-Sr. SE - Office incubation
查看>>
微软职位内部推荐-SOFTWARE ENGINEER II
查看>>
centos系统python2.7更新到3.5
查看>>
C#类与结构体究竟谁快——各种函数调用模式速度评测
查看>>
我到底要选择一种什么样的生活方式,度过这一辈子呢:人生自由与职业发展方向(下)...
查看>>
poj 题目分类
查看>>
windows 安装yaml支持和pytest支持等
查看>>
读书笔记:季羡林关于如何做研究学问的心得
查看>>