JavaScript全面了解作用域(基础、this、闭包、继承)之一
来源:互联网 发布:java 异步框架 编辑:程序博客网 时间:2024/06/06 00:38
JavaScript作用域总体来说,还是非常重要的。每一段JS都有作用域链,从低向上搜索。
第一部分:作用域链
<html> <head> <script > var p="first";function getp(){var p="second";document.write(p);}document.write(p+"\n");getp(); </script> </body></html>
第一步,我们先确定所在的作用域。第九行处于window里面。第十行处于getp()
第二步,从下搜索,一直搜索到顶层。
我们可以先总结一下:作用域链从下向上搜索,一直搜索到或者顶层。我们很容易明白,函数作用域高于全局定义域。全局变量其实就是window下面的变量。
另外我们看下面的一个小例子,比较有意思。
<script defer> var a="global a\n";function changeA(){document.write(a);var a="function a\n";document.write(a);}changeA();document.write(a); </script>
结果是什么呢?undefinedfunction a global a,真是想不到呀。
解析器,先解析作用域链,也就是说函数运行之前,作用域链已经形成。在函数运行的时候,知道a在函数内部,然后在函数里面需找,但是没有需找到,就变成未定义了。
第二部分:块作用域
JS当中没有块作用域。我们先举个C++例子
#include <iostream>using namespace std;int main(){int a=1;if(true){int a=2;cout<<a<<endl;}cout<<a<<endl;return 0;}
结果是2 1,这就是块作用域。但是在JS呢?
<script > var a=2;if(true){var a=1;document.write(a);} document.write(a); </script>
结果是11,可以看出不同点了吧,相当于重复定义了。
下面评论的朋友,没有看懂我的意思,我在这里修改一下。为什么是var a=1;不是a=1;
我的目的测试是否拥有块作用域。如果他的结果和C++一样,说明外面作用域取不到块作用域值,这是有块作用域的,否则,你能改变外界的作用域链,说明是没有的。
如果是按照下面那位兄弟说的话,无论是否拥有块作用域,他的结果都是11。就无法判断是否有块作用域之说了。
第三部分:局部定义
<script > function a() { var a=1;b=2; } a(); document.writeln(a); document.writeln(b); </script>
结果是function a() { var a=1; b=2; } 2。还有弹出一个错误。
解释一下,a没有定义,b=2;
透过现象看本质,a不是全局变量,b是。
结论是如果不写var的话,他就变成一个全局变量。
JavaScript全面了解作用域链(基础、this、闭包、继承)之一
JavaScript全面了解作用域链(基础、this、闭包、继承)之二
- JavaScript全面了解作用域(基础、this、闭包、继承)之一
- JavaScript全面了解作用域(基础、this、闭包、继承)之二
- Javascript This.作用域.闭包
- JavaScript闭包作用域与this
- JavaScript 变量作用域、this、闭包
- JavaScript 变量作用域、this、闭包
- javascript作用域和闭包,this
- JavaScript(面向对象+原型理解+继承+作用域链和闭包+this使用总结)
- javascript利用闭包this实现继承
- Javascript 中 作用域、闭包与 this 指针
- javascript 闭包,this,作用域,综合应用面试题
- javascript的作用域、闭包、this使用
- Javascript基础(四)作用域和闭包
- 深入理解javascript的一些特性(静态作用域,this指针,闭包)
- javascript基础之五(this与闭包详解)
- JavaScript 精粹 基础 进阶(7)函数和作用域(闭包、作用域)
- javascript作用域与作用域链、闭包、对象创建模式、继承模式
- 作用域 闭包 this关键字
- opengl的一个简单的双缓冲程序!
- [转]linux Shell 中常用的条件判断
- GLUT模型绘制函数
- 2011 年最重要的 10 个开源软件【转】
- 全ajax页面框架
- JavaScript全面了解作用域(基础、this、闭包、继承)之一
- Linux虚拟终端解决支持中文显示的日志记录
- ssh 连接vmwear不上
- C#之文件拖放
- ArrayBlockingQueue
- centos下装uuencode
- mysql之set、enum的认识
- 50款经典 iPhone 开源应用(附代码下载)
- Seven Languages In Seven Weeks: Week 1 (Ruby) - Day 1