十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
1:调用关键字function来构造
创新互联服务项目包括峨眉山网站建设、峨眉山网站制作、峨眉山网页制作以及峨眉山网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,峨眉山网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到峨眉山省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
function distance(x1,x2,y1,y2)
{
var dx=x2-x1;
var dy=y2-y1;
return Math.sqrt(dx*dx+dy*dy);
}
2:使用Function()构造函数(请注意与上面的大小写)
1
var f=new Function*"x","y","return x*y");
这行代码创建了一个新函数,该函数和你所熟悉的语法定义的函数基本上时等价的:
1
2
3
4
function f(x,y)
{
return x*y;
}
Functino()构造函数可以接受任意多个字符串参数。它的最后一个参数时函数的主体,其中可以包含任何JavaScript语句,语句之间用分号分隔。其他的参数都是用来说明函数要定义的形式参数名的字符串。如果你定义的函数没有参数,那么可以只需给构造函数传递一个字符串(即函数的主体)即可。
注意,传递给构造函数Function()的参数中没有一个用于说明它要创建的函数名。用Function()构造函数创建的未命名函数有时被成为“匿名函数”。
你可能非常想知道Function()构造函数的用途是什么。为什么不能只用function语句来定义所有的函数呢?原因是Function()构造函数允许我们动态地建立和编译一个函数,它不会将我们限制在function语句预编译的函数体中。这样做带来的负面影响效应就是每次调用一个函数时,Function()构造函数都要对它进行编译。因此,在循环体中或者在经常使用的函数中,我们不应该频繁地调用这个构造函数。
使用Function()构造函数的另一个原因是它能够将函数定义为JavaScript表达式的一部分,而不是将其定义一个语句,这种情况下使用它就显得比较的方面,甚至可以说精致。
3:函数直接量
函数直接量是一个表达式,它可以定义匿名函数。函数直接量的语法和function语句非常相似,只不过它被用作表达式,而不是用作语句,而且也无需指定函数名。下面的三行代码分别使用function()语句、Funciont()构造函数和函数直接量定义了三个基本上相同的函数:
1
2
3
function f(x){return x*x};
var f=new Function("x","return x*x;");
var f=function(x){reurn x*x};
在JavaScript1.1中,可以使用构造函数Function()来定义函数,在JavaScript1.2和其后的版本中,还可以使用函数直接量来构造函数。你应该注意这两种方法之间的重要差别。
首先,构造函数Function()允许在运行时动态地创建和编译JavaScript代码。但是函数直接量却是函数结构的一个静态部分,就像function语句一样。
其次,作为第一个差别的必然结果,每次调用构造函数Function()时都会解析函数体并且创建一个新东汉数对象。如果对构造函数的调用出现在一个循环中,或者出现在一个经常被调用的函数中,这种方法的效率非常低。另一个方面,函数直接量或出现在循环和函数中的嵌套函数不是在每次调用时都被重新编译,而且每当遇到一个函数直接量时也不创建一个新的函数对象。
Function()构造函数和函数之间量之间的第三点差别是,使用构造函数Function()创建的函数不使用词法作用域,相反的,它们总是被当作顶级函数来编译,就像下面代码所说明的那样:
javascript没有整型变量这个概念,变量可以被赋值为任何类型的值。数值类型只有Number,不区分整数、浮点、长整等,直接赋值为一个整数即可。如果使用过程中必须用到整数,可以通过Math.round(number),parseInt(string)等函数取整,再使用。
JavaScript 是一种脚本语言,官方名称为 ECMAScript(因定义语言的标准为 ECMA-262)。JS 的主要特点:1. 语法类似于常见的高级语言,如 C 和 Java;2. 脚本语言,不需要编译就可以由解释器直接运行;3. 变量松散定义,属于弱类型语言;4. 面向对象的。
JS 最初是为网页设计而开发的,现在也是 Web 开发的重要语言。它支持对浏览器(浏览器对象模型,BOM)和 HTML 文档(文档对象模型,DOM)进行操作,而使网页呈现动态的交互特性。
严格的说,JS 只是 ECMAScript 的一种实现,是 ECMAScript 和 BOM、DOM 组成的一种 Web 开发技术。
这里主要有两种方式来定义函数哦:
构造函数的方式:
动态添加任意多的值:
var myArray1 = new Array();
myArray1[0] = 1;
myArray1[1] = 2;
myArray1[2] = 3;
...
使用一个整数自变量来控制数组的容量(元素的个数):
var myArray2 = new Array(2);
//new的时候就给定数组中元素的个数,不过要注意的后面给元素赋值时可以随时改变数组的容量
myArray2[0] = 1;
myArray2[1] = 2;
myArray2[2] = 3;
console.log(myArray2.length);//3
定义的时候就给数组赋值:
var myArray3 = new Array("1","2","4","5");
// 后面也可以给数组元素重新赋值:
myArray3[1] = "hello word";
console.log(myArray3[1]);//返回hello word 而不是2
2.字面量方式来定义:
var myArray4 = [1,2,3,4,5];
Javascript对象定义的几种方式
一.工厂方式:先创建对象,再向对象添加方法和属性,封闭后调用不要使用new操作符创建对象。使用这种方法有很多弊端,把方法定义在工厂函数内部的时候,每次调用的时候都会产生新的函数
function factory(name,person,address,time){
var tmp=new Object;
tmp.name=name;
tmp.person=person;
tmp.address=address;
tmp.workTime=function(){
alert("we start to work at" + time);
}
return tmp;
}
var factory1=factory("drugs",100,"huashan Rd",10);
var factory2=factory("TCMdrugs",100,"hongqiao Rd",11);
factory1.workTime();
factory2.workTime();//Here,factory1 and factory2 have different method
对这种问题虽然可以用下面的方式改进,但是缺乏很好的封装性
function factory(name,person,address,time){
var tmp=new Object;
tmp.name=name;
tmp.person=person;
tmp.address=address;
tmp.workTime=workTime();
return tmp;
}
function workTime(){
alert("we start to work at" + this.time);
}
二,构造函数方式,在构造函数内部不创建对象,使用this关键字,使用时候用new操作符,存在和工厂方式相同的问题,重复创建函数。
function counstruct(name,person,address,time){
this.name=name;
this.person=person;
this.address=address;
this.workTime=function(){
alert("we start to work at" + this.time);
};
}
三.原型方式:利用prototype属性来实现属性和方法,可以通过instanceof 检查对象类型,解决了重复创建函数的问题,但不能通过传递参数初始化属性
function Car(){
}
Car.prototype.color = "red";
Car.prototype.doors = 4;
Car.prototype.mpg = 23;
Car.prototype.showColor = function(){
alert(this.color);
};
var car1 = new Car();
var car2 = new Car();
但是如果遇到下面的情况,又出问题了
Car.prototype.drivers = new Array("mike", "sue");
car1.drivers.push("matt");
alert(car1.drivers); //outputs "mike,sue,matt"
alert(car2.drivers); //outputs "mike,sue,matt"
drivers是指向Array对象的指针,Car的两个实例都指向同一个数组。
四.混合的构造函数/原型方式:针对原型方式的解决方案
function Car(sColor, iDoors, iMpg){
this.color = sColor;
this.doors = iDoors;
this.mpg = iMpg;
this.drivers = new Array("mike", "sue");
}
Car.prototype.showColor = function (){
alert(this.color);
};
var car1 = new Car("red", 4, 23);
var car2 = new Car("blue", 3, 25);
car1.drivers.push("matt");
alert(car1.drivers);
alert(car2.drivers);
五.动态原型方式:这种方式是极力推荐的方式,避免了前面几种方式所出现的问题,提供了更友好的编码风格
function Car(sColor, iDoors, iMpg){
this.color = sColor;
this.doors = iDoors;
this.mpg = iMpg;
this.drivers = new Array("mike", "sue");
if(typeof Car.initialized == "undefined"){
Car.prototype.showColor = function (){
alert(this.color);
};
Car.initialized = true;
}
}
var car1 = new Car("red", 4, 23);
var car2 = new Car("blue", 3, 25);
car1.drivers.push("matt");
alert(car1.drivers);
alert(car2.drivers);
六.混合工厂方式:和工厂方式有些相似,但采用new关键字实例化,具有和工厂方式相同的弊端,不推荐使用
javascript是一个“基于对象”的编程语言,不是面向对象的编程语言。
你要知道javascript中的function定义的函数实际上就是Function对象实例。
例如:
function demo(x){
alert(x);
}
实际上等价于:
Function demo = new Function("x","alert(x)");
所以你如果想要用javascript来模拟面向对象编程(例如Java的类),那么就可以用function来模拟Class,用function的原型prototype或者嵌套function来模拟类的方法或者属性。下面给你一个简单的例子:
//模拟学生类,可以带参数,例如initName
function Student(initName){
var name = initName; //模拟学生类的属性name
}
Student.prototype.printName = function(){ //定义Student类prototype中的printName函数
alert(this.name);
}
测试时可以这样写:
var student = new Student("张三"); //创建一个“Student对象”,实际上是一个Function实例对象
student.printName(); //执行student对象的printName函数