15,匿名函数,作用域和闭包
匿名函数(针对一次性函数使用,起到简化的作用)
Window.οnlοad=function(){…}
setTimeout(function(){…},50000);
浏览器分两遍来处理JavaScript代码:
函数作用域
第一遍:浏览器分析所有的函数声明(可以在任何地方声明),并定义这些函数声明创建的函数。 第二遍:浏览器按从上到下的顺序执行代码,并定义函数表达式(定义之后方可被调用)创建的函数。 使用函数声明创建的函数是在使用函数表达式创建的函数之前定义的,而这决定了你可在什么时候和什么地方调用函数。
闭包:
指的是函数和引用环境。
确定闭包:
(1)找出自由变量:函数中用到的不是在本地作用域内定义的变量。
(2)建立给每个自由变量都提供值的环境,以此敲定函数
(3)该函数(一般为内部函数)和环境一起被称之为闭包。
Console.log(变量);//用于调试
闭包的工作原理:
Window.οnlοad=function(){
Varcount=0;
Varmessage=”You clicked me”;
Vardiv=document.getElementById(“message”);
Varbutton=document.getElementById(“clickme”);
Button.οnclick=function(){
Count++;
div.innerHTML=message+count+”times!”;
};
};//浏览器为赋给属性button.onclick的函数创建一个闭包,其中的环境包含变量(自由变量)div,message和count
16,创建对象
对象字面量:逐个指定其属性,小规模的创建对象
对象构造函数:大量的创建对象,能够创建无数类似的(包含相同的属性)对象
如何创建构造函数:先定义一个构造函数,再使用它来创建对象
Function Dog(name,bread,weight){
//属性
This.name=name;
This.bread=bread;
This.weight=weight;
//方法
This.bark=function(){
If(this.weight>25){
Alert(this.name+”says woof”);
}else{
Alert(this.name+”says ip!”);
}
}
}
可以把对象存储到类似数组的存储数据结构
如何使用构造函数:varfido=newDog(“Fido”,”Mixed”,38);
New的功能是创造一个新对象,然后将其赋值给this,再调用构造函数,从构造函数返回一个创建的新对象
使用大量的形参时,我们可以将对象字面量和对象构造函数结合使用:
var cadiParams={
make:"GM",
model:"Cadillac",
year:1995,
color:"tan",
passengers:5,
convertible:false,
mileage:12892
}
var cadi=new Car(cadiParams);
function Car(params){
this.make=params.make;
this.model=params.model;
this.year=params.year;
this.color=params.color;
this.passengers=params.passengers;
this.convertible=params.convertible;
this.mileage=params.mileage;
this.started=false;
this.start=function(){
this.started=true;
}
this.stop=function(){
this.started=false;
}
this.drive=function(){
if(this.started){
alert("Zoom zoom!");
}else{
alert("You need to start the engine first!");
}
}
}
Instanceof:确定对象是由哪个构造函数创建的。
内置构造函数:
日期对象:
Varnow=new Date();//新建一个日期对象
VardateString=now.toString();
VartheYear=now.getFullYear();
VartheDayOfWeek=now.getDay();
自定义时间:
Varbirthday=new Date(“May 1,1983 08:03 pm”);
数组对象:
Vararray=[“a”.”b”,”c”];
VarArray=new Array(6);//用于数组长度不确定时
emptyArray[0]=99;
Array.reverse();//按相反的顺序排列数组的所有元素
Array.join(“-”);//将数组中的值合并成一个字符串,例5-3-1
其他内置对象:
Object,Math,RegExp(创建正则表达式对象),Error
17,超强的对象创建方式-原型
原型(父类):可以继承和重写用于存放对象拥有的完全相同的属性和方法(构造函数无法实现方法重用)
构造函数(子类)
如何创建原型?
通过关键字prototype创建原型,先有构造函数,然后创建原型
原型的属性和方法可以被删除和修改
运行时先在构造函数里查找,查找不到后方去原型内查找
functionDog(name,breed,weight){
this.name=name;
this.breed=breed;
this.weight=weight;
}
Dog.prototype.species="Canine";
Dog.prototype.bark=function(){
if(this.weight>25){
console.log(this.name+"says Woof!");
}else{
console.log(this.name+"says Yip!");
}
}
Dog.prototype.run= function () {
console.log("Run!");
}
Dog.prototype.wag=function(){
console.log("Wag!");
}
var fido=new Dog("Fido","Mixed",38);
var fluffy=new Dog("Fluffy","Poodle",30);
var spot=new Dog("Spot","Chihuahua",10);
fido.bark();
fido.run();
fido.wag();
fluffy.bark();
fluffy.run();
fluffy.wag();
spot.bark();
spot.run();
spot.wag();
原型链:
小狗原型
表演犬原型
表演犬实例