龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > Javascript编程 >

没那么简单 那些应该吃透的JavaScript概念(1)

时间:2013-03-06 14:58来源:未知 作者:admin 点击:
分享到:
文章的目的是让更多的程序员深入理解JavaScript的一些概念,其实关于这些,我们在可以在网上看到很多类似的内容,所以现在该是向深入理解的方向靠拢的时候了。 51CTO推荐阅读: 揭

文章的目的是让更多的程序员深入理解JavaScript的一些概念,其实关于这些,我们在可以在网上看到很多类似的内容,所以现在该是向深入理解的方向靠拢的时候了。

51CTO推荐阅读:揭开JavaScript闭包的真实面目

一,function

从一开始接触到js就感觉好灵活,每个人的写法都不一样,比如一个function就有N种写法。如:functionshowMsg(){},varshowMsg=function(){},showMsg=function(){}。似乎没有什么区别,都是一样的嘛,真的是一样的吗,大家看看下面的例子:

  1. //函数定义:命名函数(声明式),匿名函数(引用式)  
  2. //声明式,定义代码先于函数执行代码被解析  
  3. functiont1(){  
  4. dwn("t1");  
  5. }  
  6. t1();  
  7. functiont1(){  
  8. dwn("newt1");  
  9. }  
  10. t1();  
  11. //引用式,在函数运行中进行动态解析  
  12. vart1=function(){  
  13. dwn("newnewt1");  
  14. }  
  15. t1();  
  16. vart1=function(){  
  17. dwn("newnewnewt1");  
  18. }  
  19. t1();  
  20. //以上输出:newt1,newt1,newnewt1,newnewnewt1 

可能想着应该是输出t1,newt1,newnewt1,newnewnewt1,结果却并不是这样,应该理解这句话:声明式,定义代码先于函数执行代码被解析。如果深入一步,应该说是scope链问题,实际上前面两个方法等价于window.t1,可以理解为t1是window的一个公有属性,被赋了两次值,以最后一次赋值为最终值。而后面两个方法,可以理解为是t1是个变量,第四个方法的var去掉之后的结果仍然不会改变。

然而,当第四个方法改成functiont1(){}这样的声明式时,结果变成了newnewnewt1,newnewnewt1,newnewt1,newnewt1。前面两个按照我的理解可以很好的理解为什么是这个答案,第三个也可以理解,但是最后一个输出让我比较纠结,希望有高手出现解答一下。另外匿名函数还有(function(){...})()这样的写法,最后一个括号用于参数输入还有vart1=newfunction(){..}这样的声明,实际上t1已经是一个对象了。

  1. vart2=newfunction()  
  2. {  
  3. vartemp=100;//私有成员  
  4. this.temp=200;//公有成员,这两个概念会在第三点以后展开说明  
  5. returntemp+this.temp;  
  6. }  
  7.  
  8. alert(typeof(t2));//object  
  9. alert(t2.constructor());//300  
  10. 除此之外,还有使用系统内置函数对象来构建一个函数,例:  
  11. vart3=newFunction('vartemp=100;this.temp=200;returntemp+this.temp;');//这个位置加不加new结果都一样,WHY  
  12. alert(typeof(t3));//function  
  13. alert(t3());//300 

二,创建对象

首先我们理解一下面向对象编程(Object-OrientedProgramming,OOP),使用OOP技术,常常要使用许多代码模块,每个模块都提供特定的功能,每个模块都是孤立的,甚至与其它模块完全独立。这种模块化编程方法提供了非常大的多样性,大大增加了代码的重用机会。可以举例进一步说明这个问题,假定计算机上的一个高性能应用程序是一辆一流赛车。如果使用传统的编程技巧,这辆赛车就是一个单元。

如果要改进该车,就必须替换整个单元,把它送回厂商,让汽车专家升级它,或者购买一个新车。如果使用OOP技术,就只需从厂商处购买新的引擎,自己按照说明替换它,而不必用钢锯切割车体。不过大部分的论点是,JavaScript并不是直接的面向对象的语言,但是通过模拟可以做到很多面向对象语言才能做到的事,如继承,多态,封装,JavaScript都能干。

  1. //以下三种构造对象的方法  
  2. //newObject,实例化一个Object  
  3. vara=newObject();  
  4. a.x=1,a.y=2;  
  5. //对象直接量  
  6. varb={x:1,y:2};  
  7. //定义类型  
  8. functionPoint(x,y){//类似于C#中的类  
  9. this.x=x;  
  10. this.y=y;  
  11. }  
  12. varp=newPoint(1,2);//实例化类 

第一种方法通过构造基本对象直接添加属性的方法来实现,第二种和第一种差不多,可以看成是第一种方法的快捷表示法。第三种方法中,可以以”类“为基础,创造多个类型相同的对象。

精彩图集

赞助商链接