一、JavaScript中的圈地运动-作用域

  • 数据也是要有隐私的–我的地盘我做主;
  • JS中没有代码块(代码块就是指私有块)—使用函数运行的机制创建;
  • 变量预解释是在各自的作用域里的预解释;

使用函数运行的机制创建

如果函数定义一次,运行两次;就会出现两个私有作用域;这两个作用域内的值是没有关联的,他们是在各自的作用域里;

如果仅仅是为了保护代码块;不需要函数的方法,可以用下面来保护n的值;

<script >
function fn(){
var n=9;
}
var n=1000;
(function(){
var n=10;
})();
//以上三个n是互不干扰的;
</script>

实例练习:下面是作用域和作用域链的实例;

<script >
var n=9;
var s="zhuanbang";
function fn(){
alert(n);
alert(s);
n=7;
var n=6;
};
fn();//运行这个函数,会输出什么结果?
//答案:第一次;undefined;第二次:"zhuanbang";
</script>
<script >
var n=9;
var s="zhuanbang";
var f="window-f";
function fn(){
alert(n);
alert(s);
n=7;
var n=6;
var f="fn-f";
function inner(){
alert(n);
alert(s);
alert(f);
var f="f";
}
inner()
};
fn();//运行这个函数,会输出什么结果?
//答案:第一次;undefined;第二次:zhuanbang(注意:不是字符串形式"zhuanbang"),第三次是6,第四次是"zhuanbang",第五次:undefined;
// 函数fn中的n会在里面找,如果有n,但是n在alert的时候还没有赋值,所以此时是undefined;fn中的s也会在本代码块里面的找;s在本代码块里找不到,会向上一层代码块里找;此时的s是zhuanbang;所以会弹出zhuanbang;inner()里面的代码也是一样的道理;
</script>

细节:JS中顶级作用域是谁?

  • Global对象—你见过上帝吗?//Global是全局变量;是真正的全局对象;
  • window对象—这是国王,上帝的代理人;
  • Global的属性(见高程三133页

并不是所有内置对象都是window对象;比如Object和Math,String、Number、Boolean、Function、六个包装类;和window是一级的,不属于window对象内的作用域;是Global内的对象;

js的全局作用域也不全是window;但是在前端编程里是window(浏览器内);也可以做后台,属于进程,nodejs里的全局对象是(person,好像是这么叫的,谐音;)

二、变量和属性有什么关系??

(变量也是属性,属性也是变量)

  • 全局变量是window的属性;
  • window的属性也可以看做全局变量;
  • 一个对象的属性,也可以看这以这个对象为作用域下的变量-with语句(with是什么意思?不经常用,会引起作用域的混乱;需要了解with(with里,var一个对象是直接全局对象,不加var;需要试一试,));
  • 那看代码:function fn(){var a=9};(这个n变量是谁的属性???(反推的情况不成立,否则我们用fn.n就能返回9了):对象是一个作用域,可以把对象的一个属性作为作用域;那对象可不可以是对象呢?//它是fn新开辟的一块内存中的一个属性;)
  • fn函数里的a是谁的属性呢?

三、活动对象:函数内的内存地址有声明周期,是会被销毁的;

  • 函数的运行是个有生命周期的内存地址;
  • 或者说:函数运行时,会创建一个内存地址,当此函数运行结束时,此内存地址又会销毁,这个地址,我们无法保存,它的灵活的、活动的、有声明周期的; (活动对象,也就是函数运行的作用域(新开辟一个空间的),是有声明周期的;活动对象相对的就是固定对象,固定对象就是一个固定的内存地址,给它赋值一个变量,以后还可以操作他;但是活动对象的作用域,从外部是没法改变的,除非它内部自己变。外面是变不了的;无法操作的,也是无法破坏和修改里面内容的;)
  • 函数里的变量,就在这个内存里创建的,我们可以把这个内存当做一个对象,那函数里的变量就是这个对象的属性;
  • 要深刻理解函数的定义和函数的运行;

四:作用域和闭包:不会被销毁的情况;

  • 可以简单的理解为作用域就是闭包;
  • 闭包是机制,而不是形式,不是概念;
  • 不同教材对闭包的解释不同的;
  • 《高程3》192页小结中的解释(需要看,好好理解);
  • 《权威指南》182页中对闭包的解释;(需要看;权威指南有些事的,函数定义后,如果想把闭包返回给外面用,必须return;内部状态不仅包含函数的代码逻辑,还必须引用当前的作用域链;函数对象可以通过作用域链和相互关联起来;函数体内部的变量都可以保存在函数作用域内,这种特性在计算机科学文献中称为闭包)
  • 使用闭包,还不如直接说使用一个作用域。实在人不用闭包这个概念!(程序员的自我修养–不吓人)

注意:只要扯到闭包,就与作用域有关系,也就与作用域链有关系;从技术的角度上讲,所有的JavaScript函数都是闭包,他们都是对象,他们都关联到作用域链,定义大多数函数时候的作用域链在调用函数时依然有效;但这并不影响闭包;

高程3解释:当在函数内部定义了其他函数时候,就创建了闭包(可以理解为,只要函数运行了私有作用域,就创建了闭包);闭包有权访问包含函数内部的所有变量(函数里面的变量可以访问上一级函数内的数据;);原理如下;

  • 3
  • 上,

有修养的人不提闭包;(可以试着查闭包的英文,用英文说;)

闭包用在什么场合?

  • 保护变量
  • 协调异步代码
  • 实例

需要分开一篇文章,细细总结:

 

 

 

 

 

 

““`