Javascript高级程序设计—执行环境及作用域

2012年5月3日 没有评论 39 次阅读     

执行环境

执行环境其实就是一个变量或者一个函数有权访问的所有其他数据集合。在每个执行环境中都有一个与之相关联的变量对象(VO,在当前环境中定义的所有变量和函数都会保存在这个变量对象中。VO我们是无法访问的,只有解析器处理数据的时候才有权在后台使用它。

全局执行环境是最外围的环境,一般是window对象,因此我们定义的所有全局变量、函数都被创建为window对象的属性和方法。当某个执行环境中的代码执行完毕,该环境将被销毁,其中的所有变量、函数也同样。

函数在被调用时会创建自己的执行环境,并推入一个栈中。当执行完毕,再弹出以返回到原来的执行环境中去。这个类似于C语言中的函数调用。

作用域链

代码在执行到一个环境中时,会创建由VO构成的作用域链。假如A的执行环境a中调用了函数B产生新的执行环境b,那么b的作用域链最前端将会保存b的VO,链的下面紧接着是它的包含作用域a的VO,如此一直到链的最后是全局执行环境的VO。

标识符的解析器是就是沿着当前环境的作用域链来搜索的。如:

var hello = “coomy”;
function say(){
    var hello2 = “ming”;
    alert(hello);
}
say();  //coomy
alert(hello2);  //error 404

当say函数被调用时,对hello进行解析时,会扫描作用域链。首先是自己的VO,发现并没有这个变量,然后开始搜索其上层包含环境的VO,发现了hello。但是外层的作用域中是无法访问其所包含的作用域中的变量的,这些语法都是类似于C语言中的作用域概念。当然,作用域链可以以此类推到多层的嵌套中去。

注意,函数的参数也是被当作变量来对待的,访问规则与执行环境中的其他变量相同。

块级作用域

在C语言中我们知道,一对花括号之间会形成一个新的作用域,也就是新的执行环境。在其中定义的变量,当离开花括号后都会被注销。

但是在javascript中,花括号、if语句、for等这些块级语句在执行完之后,其过程中定义的变量等则不会被注销,而是会被加到其外部的执行环境中去。

{
    var a = 1;
}
if ( true ) {
    var b = 2;
}
for ( var c=2; c==2; c++ ){
    var d = 4;
}
while ( true ) {
    var e = 5;
    break;
}
switch ( a ) {
    case 1: var f = 6;
    default: var g = 7;
}
alert('out:'+a+b+c+d+e+f+g);//out:1234567

注意:

  •  用var声明变量会将其加到距离最近的环境中;
  • 未声明的变量被初始化,该变量会被自动加入到全局作用域中;
  • 当前环境的变量等标识符,会覆盖其父环境中的标识符,因为作用域链中当前环境是处在最前面的,也会被最先搜索。当找到时便立即停止向下继续检索。
太烂了..略有不足凑合吧哎呦,不错酷~力荐! (嗨!童鞋,来这儿坐沙发画星星..)
作为拓荒者,我表示此文:
Loading ... Loading ...

Javascript面向对象编程–闭包浅析

2012年4月28日 没有评论 41 次阅读     

最近在看Javascript,起初认为闭包仅仅就是函数访问外部的变量这么简单,但是后来接触到一个简单的递归函数的时候,才开始了对闭包的思考。闭包可以说是一种底层机制的上层体现(我是这么认为的)。是先有了底层的垃圾回收及作用于链、引用等机制,才进而产生了“闭包”。

闭包是指有权访问另一个函数作用于中的变量的函数【引自《Javascript高级编程第二版》P144】。定义很简单~但也太浅显。定义中没有提及闭包的潜在功能和其意义,所以还需要我们继续探索,闭包究竟可以为我们做什么。

作用域链

  • (若不了解,可首先参考本站另一篇执行环境及作用域)
  • 在创建一个函数的时候,会预先为其创建一个包含全局变量对象的作用域链,保存在一个特殊内部属性Scope中
  • 当某个函数第一次被调用时会创建一个执行环境及相应作用域链,并赋值给Scope
  • 使用this、arguments和其他参数的值初始化函数的活动对象

有了上面三步,一个函数的作用域链便组合完毕。外部函数的活动对象是始终处于内部活动对象之后的!所以其作用域链中包含两个变量对象:1本地活动对象2全局变量对象。(只引用,不包含)

一般函数执行完毕后,局部活动对象就被销毁,,内存中仅仅保存全局作用域。但闭包的情况不同!

function kkk() {
  var a = 1;
  return function(){alert(a++)};
}
var fun = kkk();
fun();// 1 执行后 a++,,然后a还在~
fun();// 2
fun = null;//a被回收!!

阅读全文…

分类: JavaScript 标签: , ,
太烂了..略有不足凑合吧哎呦,不错酷~力荐! (嗨!童鞋,来这儿坐沙发画星星..)
作为拓荒者,我表示此文:
Loading ... Loading ...

Javascript面向对象编程–类定义

2012年4月27日 没有评论 33 次阅读     

在javascript中可以通过下面两种方式来定义一个对象:

var A = { a:1, b:2};
var B = new Object({a:1, B:2});

这两种方式是几乎相同的。他们都是通过javascript中内置的Object类模型来创建新的对象。那还有一种创建方式就是我们自己定义类,并创建相应的对象。

我们知道,在Javascript中函数其实是一种典型的对象。假如我们定义了一个函数之后将其赋值于一个变量,那么该变量获得这个函数的引用,也就成了一个对象。
下面我们定义一个类:

User = function(_name){
    var age = 24;
    this.name = _name;
    this.hello = function(){alert(this.name);};
}
var me = new User('coomy');
me.hello();//coomy

上面的例子便是一个典型的类定义到实例化的过程。其中User类中的age并非属性,而通过this定义的name才是类的属性。 阅读全文…

分类: JavaScript 标签: ,
太烂了..略有不足凑合吧哎呦,不错酷~力荐! (嗨!童鞋,来这儿坐沙发画星星..)
作为拓荒者,我表示此文:
Loading ... Loading ...

自己在用的Web配色工具-推荐

2012年4月27日 没有评论 19 次阅读     

1、http://xvdesign.com/color/
这个工具功能较好,可以分单色、补色、三元色和双补色,而且其实时效果查看器是把好多中原色穿插在一起,更方便去看多种颜色交织的效果。挺不错~

2、http://www.mb5u.com/tool/peise/
这个工具提供一个基本色,然后推荐相应的较好配色系列。如果觉得不满意可以调整其亮度。后期微调时用的比较多的工具。

3、http://kuler.adobe.com/#themes/rating?time=30
这个站经常推荐一些较好的配色系列图,没事儿的时候可以过来看看,找找灵感。挺不错的~

4、http://hi.baidu.com/xi1zi/blog/item/0cc8b80e461c4be637d1228c.html
其他工具集锦!(1)

5、http://www.68design.net/Web-Guide/Web-Theory/42944-1.html
其他工具集锦!(2)

分类: 前台设计 标签:
太烂了..略有不足凑合吧哎呦,不错酷~力荐! (嗨!童鞋,来这儿坐沙发画星星..)
作为拓荒者,我表示此文:
Loading ... Loading ...

windows下搭建subversion+TortoiseSVN笔记

2012年3月26日 评论已被关闭 51 次阅读     

最近自己在本机上搞项目,就索性给自己本机构建了一个svn服务器,这样自己维护自己的代码,也比较爽…捣持过后,特此总结。

1. 到官方网站去下载最新版的subversion

win32版本的或者其他都行,我感觉没什么所谓。其中VisualSVN是bin目录的一些程序更新,不是安装版的,下载后直接覆盖原有目录即可升级。

2. 到官方网站去下载你安装的subversion对应的TortoiseSVN版本,每个对应版本官网上都简要介绍了对应的匹配版本号,若对不上貌似使用起来会出问题;

3. 都正常安装在系统中

4. 在某盘下新建一个文件夹,用来存放所有的版本库;假设在D:\svn

5. 默认情况下,我们需要自己手动在subversion的bin目录下写bat批处理启动svnserve.exe,而且启动后会有一个终端在桌面上运行不能关闭,这样比较麻烦;那我们可以建立windows自动启动服务,让系统每次开机自动后台运行svn服务: 阅读全文…

分类: 系统技术 标签: ,
太烂了..略有不足凑合吧哎呦,不错酷~力荐! (嗨!童鞋,来这儿坐沙发画星星..)
作为拓荒者,我表示此文:
Loading ... Loading ...

基于jquery的div框平滑向上翻滚

2012年3月16日 没有评论 98 次阅读     

之前曾经在Google的Chrome web store上看到页面的商品通过一个个的小格子实现,而且当鼠标移动到上面时可以向上翻滚,顿觉这种设计不错。一方面可以让用户在第一个格子上对产品做一个简单的了解,如果需要交互操作,则不需要另外的弹出层或者跳出,直接在原有版面上做操作。其滚动的过程可以让用户忽略等待时间,心情也挺愉悦。最重要的一点,应该是用户注意力仍然集中在各种盒子上面,让你有欲望去打开其他的盒子,看个究竟。。

恩不知道Google用的什么实现方法,用firebug看了下应该不是用两个盒子调整间距实现的,它是当hover的时候从原来的盒子下面插入新的盒子。后来我从网上参考了那种滚动新闻的方法,实现了一个平滑向上翻滚的盒子结构。其实很简单,就是大盒子套两个小盒子,大盒子的大小跟小盒子同样大,也就是同一时间只显示其中一个,overflow调整为hidden即可。至于翻滚效果,用jquery可以轻松的实现。 阅读全文…

太烂了..略有不足凑合吧哎呦,不错酷~力荐! (嗨!童鞋,来这儿坐沙发画星星..)
作为拓荒者,我表示此文:
Loading ... Loading ...

心中的豆瓣 产品与创业

2012年3月12日 没有评论 56 次阅读     

豆瓣上入住大半年了,初次认识它还是那会儿写小论文的时候。我从高中熬夜复习的时候养成的毛病,学习的时候必须带着耳塞听点东西,不然容易走神。一次师兄见我在Google音乐上听歌,甚麻烦,于是推荐我上豆瓣FM。就这样,半年过去,豆瓣上至现在已经累计收听1986首。我想此刻这世上除了我自己,已经再没有谁比得上豆瓣FM懂我喜欢听什么风格的音乐了,它在静静的聆听我的内心,尽她所能的收集我的每个细节。当我不小心听到心动的曲子,便迫不及待的加上红心或者分享。我想,这就是豆瓣效应。

在创建豆瓣的初期,她爹仅仅是因为自己想要分享喜欢的音乐、看的电影、常看的书。出发点很简单,因为当前网络应用没有那种可以满足他简单的需求,于是他选择了自己创造。记得在《重来》一书中说过,最好的创新,就是去满足自己眼下的需求,你需要什么,什么给你带来了不便,你便去创造什么。于是豆瓣诞生了

她爹选择了几种最能渗透人内心的玩意儿:音乐、电影、书。我不小心发现,他们都是些可以记录历史的东西,是被时间不断封陈,而且 越陈越香的东西。只有感性的人才更容易在这里扎根,因为他们对这些元素都有着一些说不清言不明的感情,是在人群中突然听到人在谈论,会抬头凝视,并微微一 笑的情感。 阅读全文…

太烂了..略有不足凑合吧哎呦,不错酷~力荐! (嗨!童鞋,来这儿坐沙发画星星..)
作为拓荒者,我表示此文:
Loading ... Loading ...

CSS中让div居中显示及横排列的若干方法

2012年1月12日 没有评论 91 次阅读     

div居中显示:

web前台开发的过程中经常遇到希望div居中显示,那大家应该都会知道下面的这种方法:

 #mydiv{ margin:0 auto;}

这种方式,在firefox和chrome等浏览器下是没有问题的,但是在IE浏览器下就不那么稳定了。那当源代码在IE下不能居中显示的时候,可以试着在你的HTML文件的头部加上DOCTYPE声明后试试:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

div横向排列的方法(不用table)

默认的div在html中是竖排排列的,那传统最土的方法我们可以直接通过table来控制各个div的排列结构即可:

A
B

代码如下
阅读全文…

分类: HTML/CSS 标签:
太烂了..略有不足凑合吧哎呦,不错酷~力荐! (嗨!童鞋,来这儿坐沙发画星星..)
作为拓荒者,我表示此文:
Loading ... Loading ...

ThinkPHP新手快速入门笔记

2012年1月10日 没有评论 115 次阅读     

本文简要的介绍了如何从无到有的创建一个基于thinkphp框架的项目,并对项目进行相应的配置以及一些基本原理的介绍。在介绍的过程中涉及到的具体内容都可以去thinkphp官方网站下载核心包或者完全包、帮助文档进行学习。
那这里工程中我们可以直接下载核心包即可,可以将该包解压放置在任何位置,只要我们的项目能够访问得到。假设我们的项目在coomy文件夹下,统计目录放核心文件夹名为thinkphp。

入口文件

首次访问项目时访问的php文件。在开始项目之前,可以在任意位置创建一个php文件,在该文件中引入thinkphp核心文件,并自动生成项目目录。在浏览器中访问该入口文件后,弹出“Hello!欢迎使用thinkPHP!”的页面说明项目创建成功。下面的示例在coomy文件夹中创建create.php文件,并加入以下代码:

require '../thinkphp/ThinkPHP.php';
App::run();

这样在浏览器中访问http://localhost/coomy/create.php后,便会发现目录coomy中生成了以下文件夹:

coomy
|—-Common 公共函数区
|—-Conf       配置
|—-Lang       语言包
|—-Lib
      |—- Action 控制器
      |—- Model 模型
|—-Runtime 运行时缓存等
|—-Tpl 模板

控制器用来接收用户的输入,并调用模型和视图去完成用户的需求。模型则定义了一个网站的数据库相关业务逻辑。 阅读全文…

分类: PHP, web开发 标签: ,
太烂了..略有不足凑合吧哎呦,不错酷~力荐! (嗨!童鞋,来这儿坐沙发画星星..)
作为拓荒者,我表示此文:
Loading ... Loading ...

新年成都之行随笔

2012年1月5日 3 条评论 384 次阅读     

启程

时间:2011年12月31日早上6点
地点:从蜀景苑+博奥丽苑,大家伙出发,向合肥骆岗机场进军,目的地-成都(市双流县黄水镇CQ村)
人物:妞、队长、老金、大法、老猪、哥(其他地区同志:大富、大师、77、棍西)
事件:大脸强结婚!我们工大05级计算机1班第一人。

这帮家伙就这么的带着希望启程了。那时候天还没亮,我都不记得上次起这么早是那个猴年马月了,除了兴奋,没别的说。

前奏

历时两个多小时,11点多就灰到了成都双流县国际机场,看见大脸强一阵兴奋,除了哥。哥可是上个月刚来过一趟成都。少等了一会儿77之后,乃们出门儿就被坑了,各种打车宰人啊那是,到双流乔一乔小吃一餐后,就开始了此次以大脸强为首的,中国四大古城之一的成都跨年之旅

十几个老男淫在街上乱窜了一大阵儿后,无路可寻,遂坐上了810这辆通往那个名叫黄水镇的乃们想像中的胜地。

事实告诉乃们,它就是一个镇子。哥几个开始有了一种不祥的预感。

到大脸强姐姐家的店铺那儿折腾了几张刮刮卡,这几个老骨头经过步行几千米的提炼,再加上公交车上的拥挤,体力已经基本上告别自行车了。老金直接从刚来时正装+围巾的文艺青年,整成了外套栓腰间、膘肉在胸口的2B青年阅读全文…

分类: 幻想De, 旅途 标签: , ,
太烂了..略有不足凑合吧哎呦,不错酷~力荐! (嗨!童鞋,来这儿坐沙发画星星..)
作为拓荒者,我表示此文:
Loading ... Loading ...