js组成:
1.Bom 2. Dom 3.ECMAscript(目前主流使用的标准是5.1版本)
为什么学习js?
当前什么越来越强调沟通,而js 是最接近前后端的语言,越来越多的前后端框架的支持,使他的前途很明朗,作为一种解释型语言,js强调实时,在线。这符合It的发展趋势。
js全局变量
Function /Object/Array/Boolean/Date/Number/String/RegExp/Math
js类的写法
1.构造方法
function foo{
this.name = "囧"
}
添加方法或者属性
foo.prototype.doSomething = function{
alert("done!!!");
}
使用:
var foo = new foo();
foo.doSomething;
this的用法: 1.函数调用,此时this作为全局变量
2.作为对象的方法调用,指向上级对象
3.作为构造函数指定对象的属性,指向是对象
4.对象的方法的apply()调用(从0开始递增,this代表从全局变量到局部变量指针的改变)
出处:http://www.ruanyifeng.com/blog/2010/04/using_this_keyword_in_javascript.html
2.object.create()
var foo = {
name:"囧",
doSomething: function(){alert("done!!!");}
}
这里可以看出这是一种描述对象的方式,所有成员都看做是类的属性。
使用:
var foo = Object.create(foo);
如果是旧的浏览器可以使用:
if (!Object.create) {
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
}
比构造方法简单,不能实现私有属性和私有方法,实例对象之间也不能实现数据共享。
3.极简主义
var Foo={
createNew:{
var foo = {};
foo.doSomething = function(){alert("done!!!") ;}
return foo;
}
};
使用:
var foo = Foo.createNew();
3.2 继承
让一个类继承另一个类,实现起来很方便。只要在前者的createNew()方法中,调用后者的createNew()方法即可。
先定义一个Animal类。
var Animal = {
createNew: function(){
var animal = {};
animal.sleep = function(){ alert("睡懒觉"); };
return animal;
}
};
然后,在Cat的createNew()方法中,调用Animal的createNew()方法。
var Cat = {
createNew: function(){
var cat = Animal.createNew();
cat.name = "大毛";
cat.makeSound = function(){ alert("喵喵喵"); };
return cat;
}
};
这样得到的Cat实例,就会同时继承Cat类和Animal类。
var cat1 = Cat.createNew();
cat1.sleep(); // 睡懒觉
3.3 私有属性和私有方法
在createNew()方法中,只要不是定义在cat对象上的方法和属性,都是私有的。
var Cat = {
createNew: function(){
var cat = {};
var sound = "喵喵喵";
cat.makeSound = function(){ alert(sound); };
return cat;
}
};
上例的内部变量sound,外部无法读取,只有通过cat的公有方法makeSound()来读取。
var cat1 = Cat.createNew();
alert(cat1.sound); // undefined
3.4 数据共享
有时候,我们需要所有实例对象,能够读写同一项内部数据。这个时候,只要把这个内部数据,封装在类对象的里面、createNew()方法的外面即可。
var Cat = {
sound : "喵喵喵",
createNew: function(){
var cat = {};
cat.makeSound = function(){ alert(Cat.sound); };
cat.changeSound = function(x){ Cat.sound = x; };
return cat;
}
};
然后,生成两个实例对象:
var cat1 = Cat.createNew();
var cat2 = Cat.createNew();
cat1.makeSound(); // 喵喵喵
这时,如果有一个实例对象,修改了共享的数据,另一个实例对象也会受到影响。
cat2.changeSound("啦啦啦");
cat1.makeSound(); // 啦啦啦
js闭包
关于闭包的解释
闭包是很多语言都具备的特性,在js中,闭包主要涉及到js的几个其他的特性:作用域链,垃圾(内存)回收机制,函数嵌套,等等.
作用链 ,简单来说,作用域链就是函数在定义的时候创建的,用于寻找使用到的变量的值的一个索引,而他内部的规则是,把函数自身的本地变量放在最前面,把自身的父级函数中的变量放在其次,把再高一级函数中的变量放在更后面,以此类推直至全局对象为止.当函数中需要查询一个变量的值的时候,js解释器会去作用域链去查找,从最前面的本地变量中先找,如果没有找到对应的变量,则到下一级的链上找,一旦找到了变量,则不再继续.如果找到最后也没找到需要的变量,则解释器返回undefined.
内存回收机制 了解了作用域链,我们再来看看js的内存回收机制,一般来说,一个函数在执行开始的时候,会给其中定义的变量划分内存空间保存,以备后面的语句所用,等到函数执行完毕返回了,这些变量就被认为是无用的了.对应的内存空间也就被回收了.下次再执行此函数的时候,所有的变量又回到最初的状态,重新赋值使用.但是如果这个函数内部又嵌套了另一个函数,而这个函数是有可能在外部被调用到的.并且这个内部函数又使用了外部函数的某些变量的话.这种内存回收机制就会出现问题.如果在外部函数返回后,又直接调用了内部函数,那么内部函数就无法读取到他所需要的外部函数中变量的值了.所以js解释器在遇到函数定义的时候,会自动把函数和他可能使用的变量(包括本地变量和父级和祖先级函数的变量(自由变量))一起保存起来.也就是构建一个闭包,这些变量将不会被内存回收器所回收,只有当内部的函数不可能被调用以后(例如被删除了,或者没有了指针),才会销毁这个闭包,而没有任何一个闭包引用的变量才会被下一次内存回收启动时所回收.
闭包的资源回收
function f1(){
var n=999;
return function f2(){
alert(n);
};
};
var a = f1();//当代码运行到这里,f1虽然已经执行完毕,但是变量n并未被回收,而是被变量a(也就是返回的函数f2)
//所引用着。
a=null;//代码到这里的时候,变量a又指向了null,a和函数f2的联系被切断。f2不再被引用,因此f2被回收//f2被回收后,它对n的引用也就不存在了,因此同理,n不再被引用,n也被回收不再占用内存。
闭包的用途:
主要有两个,一个是获取函数的局部属性,而是保持函数的局部属性在内存中的存在。
前端框架:
dom: jquery mootools prototype dojo
Routing: History Js/sammyJs/navJs
mv*:backbone /Ember/burandal/angular
data:amplityJs/breezeJs
Testing:Mocha/Jasmme/qunit