技术开发 频道

那些应该吃透的JavaScript概念

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

  一.function

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

//函数定义:命名函数(声明式),匿名函数(引用式)
//声明式,定义代码先于函数执行代码被解析
functiont1(){dwn(
"t1");
t1();  
functiont1(){dwn(
"newt1");}
t1();
//引用式,在函数运行中进行动态解析
vart1
=function(){dwn("newnewt1");}
t1();
vart1
=function(){dwn("newnewnewt1");}
t1();
//以上输出:newt1,newt1,newnewt1,newnewnewt1

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

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

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

  二.创建对象

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

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

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

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

0
相关文章