<html>

<head>
<title>scope basic</title>
</head>
<body> <script type="text/javascript">
//作用域:成员,函数,变量可以被访问的范围。块作用域,函数作用域,动态作用域,词法作用域(静态作用域或者闭包)
//js不是块作用域
alert(a);//undifiend
alert(b);//undifiend
alert(c);//报错
alert(d);//报错 var a = 1;//全局window成员
if(false){//预处理阶段,if语句当成不存在一样,所以会把b加入全局window对象
var b = 2;
}else {
c = 3;//不是全局window成员,没有var声明,
}
function f () {//f是window全局成员
var d = 4;//d属于f的成员,外部访问不了,
} --------------------------------------------------------
//块作用域:大括号括起来的代码
for(var i =0; i < 3 ; i++){ }
alert(i); //弹出3,说明js没有块作用域.
//js也没有函数作用域 ------------------------------------------------------
//动态作用域,变量的值在执行的时候有值,所以js没有动态作用域
//静态作用域:在函数创建的时候,函数有一个成员scope。他的值是创建这个函数的环境(window对象或者其他)
function f () {//scope == window
alert(x);//函数f调用的时候,会首先在函数自己的词法环境中找x,找不到就去他的scope中找,scope是window,也没有x就报错。
} function f1 () {
var x = 5;
f(); //弹出5,实际报错,x未定义
} function f2 () {
var x = 6;
f();//弹出6,实际报错,x未定义
}
f1();f2();
--------------------------------------------------- //静态作用域:在函数创建的时候,函数有一个成员scope。他的值是创建这个函数的环境(window对象或者其他)
//作用域链:f.scope = window ,f调用的时候会创建自己的词法环境le(函数局部作用域),并且跟scope关联起来,f.le = f.scope,f的词法环境le(函数局部作用域)中有le{x : 100 ; g :指向函数引用},创建函数g时候g.scope = f.le,g函数调用时候会创建自己的词法环境(g的函数局部作用域)le,并且跟自己的scope关联,
function f () { //f.scope == window
//f.le{x =100} ->f. scope
var x = 100;
function g () { //g. scope ==f.le
//g.le ->g. scope
}
g();
}
//函数他自己的环境 --> 他自己的scope --> 指向创建他的环境,
// g.le ->g. scope ->f.le ->f. scope ==winow
//f.le ---> f.scope ---> 创建他的环境
//如果函数作用域找不到变量,就是创建这个函数的作用域去找变量 -------------------------------------------------------
//函数创建方式
function f(){}
var f = function(){}//匿名函数
var f1 = function x(){}//这种方式创建函数很少,x永远访问不到
var f2 = new Function('参数',函数体)
//每创建一个函数就形成一个新的作用域,跟父的作用域形成一个链条,作用域链:函数自己的作用域(大括号范围)找不到就去父级的作用域去找。new Function创建的作用域永远是全局作用域
function f () {
var x = 100;
var g = function () {
alert(x);
}
g();//
}
f(); function f () {
var x = 100;
//g.[[scope ]]=window
var g = new Function("","alert(x)");//只会去window作用范围去找
g();
}
f(); --------------------------------------------
(function(){
var a = 5;
var b = 6;
function f(){
alert(a);
}
window.f = f;
})();
f(); </script>
</body> </html>
作用域链:函数自己的作用域(大括号范围)找不到就去父级(父函数)的作用域去找。
<html>
每个函数有2个属性,一个是谁创建了这个函数(函数定义写在哪里面谁就是创建他的那个谁),一个是函数的作用域(函数题的局部作用域中有哪些属性和函数)。
<script>
var x=6;
function f () { //f.le={x:未定义},f.scope=window(window创建的f函数不是f1的作用于创建的函数)
alert(x);
} function f1 () {
var x = 5;
f(); //6,f.le={x:未定义},f.scope=window(window创建的f函数不是f1的作用于创建的函数)
function f2(){
alert(x);
};
f2();//5,f2的作用域f2.le={x:未定义},f2的创建他自己这个函数的变量f2.scope=f1.le,因为是f1的作用域创建了f2函数。
} f1(); (function(){
var a = 1;
var b = 2;
function f3(){
alert(a);
}
window.f3 = f3;
})();
f3();//1 </script>
</html>

 

最新文章

  1. Dom探索之基础详解
  2. Mac快捷键与命令学习
  3. java中的static使用--静态变量、静态方法
  4. DNS基础及域名系统架构
  5. C#基础性问题
  6. ERP 能够做什么
  7. 安装完sql server 后修改计算机名后不能进行发布的订阅的解决办法
  8. 201521123073《Java程序设计》第4周学习总结
  9. gprinter佳博打印机androidSDK
  10. laravel创建项目
  11. C# WebApi+Task+WebSocket实战项目演练(四)
  12. 第二阶段第一次spring会议
  13. Request URI Too Long
  14. java 简单计算器
  15. DWZ(二):经常使用组件了解
  16. JavaScript中解决多浏览器兼容性问题的方案
  17. Windows下搭建PHP开发环境-WEB服务器
  18. KVM WEB管理工具——WebVirtMgr(二)日常配置
  19. C++学习 - 虚表,虚函数,虚函数表指针学习笔记
  20. Linux学习记录(二)

热门文章

  1. 7. 关于IntelliJ IDEA删除项目
  2. 继承—Monkey
  3. 外部样式表声明的样式并不会进入style对象
  4. Debian9.5 系统配置FTP
  5. [JSOI2018]潜入行动 树形DP_复杂计数
  6. dijkstra STL 堆优化
  7. kubernetes学习与实践篇(一)主要概念介绍
  8. NetHogs---按进程或程序实时统计网络带宽使用率。
  9. 新人 记录VUE中分页实现
  10. 关于memset赋最值