学习javascript的闭包,原型,和匿名函数之旅
本文通过示例给大家介绍javascript的闭包,原型,和匿名函数,具体详情请看下文。
一.>关于闭包
理解闭包需要的知识
1.变量的作用域
例1:
varn=99;//建立函数外的全局变量 functionreadA(){ alert(n);//读取全局变量 }
readA();//执行此函数
例2:
functionreadB(){ varc=9; functionreadC(){ console.log(c);//okc可见 } returnreadC; } alert(c);//errorcisnotdefined.
note: 函数内部声明变量c时,一定要加上var,否则c会成为一个全局变量
所以函数内可见全局变量,函数内的局部变量却对外不可见
js的作用域是链式的,父对象里的变量总对子对象可见,子对象的对象却对父对象不可见
当我们要获取函数内的内部变量
于是有了例3:
functionreadB(){ varc=9; functionreadC(){ console.log(c); } returnreadC(); } readB();
闭包很类似基于此做了一个变式
functionreadB(){ varc=9; functionreadC(){ console.log(c); } returnreadC; } varres=readB(); res();
note:
1.慎用闭包,注意内存占用,因为它会保存父函数的状态
2.不要随便改变父函数内部变量的值
理解闭包
note:this指包含它的函数被执行时所属的对象
例1:
varname="TheWindow"; varobject={ name:"MyObject", getNameFunc:function(){//此时this(这个执行函数)是属于object对象的,是object对象下的一个属性的值 returnfunction(){//此时this(这个执行函数)是一个匿名函数,从根对象window生成,是属于window returnthis.name; }; } }; console.log(object.getNameFunc()());//thewindow
例2:
varname="TheWindow"; varobject={ name:"MyObject", getNameFunc:function(){ varthat=this; returnfunction(){ returnthat.name; }; } }; console.log(object.getNameFunc()());//MyObject
二.>匿名函数
直接定义一个匿名函数然后调用这个匿名函数,这种形式在jquery插件的定义时很常见
1.通过函数字母量的方式.先声明一个匿名函数,然后执行它
(function(){ console.log('excuteself'); })();
2.通过优先表达式的方式,由于Javascript执行表达式是从圆括号里面到外面,所以可以用圆括号强制执行声明的函数
( function(){ alert(2); } () );
3.void操作符用void操作符去执行一个没有用圆括号包围的一个单独操作数
voidfunction(){console.log('void')}();
三.>关于prototype
原型prototype
理解js中的protitype首先需要明白js的面向对象设计
functionPeople(name){ this.name=name; console.log(this);//Window或者object{name:'xxx'} this.introduce=function(){//实例对象方法 console.log(this.name); } } newPeople('leon').introduce(); //这里有一个非常有趣的现象,结合前面的来看的话, //首先functionpeople里的this指向的默认是Window对象 //当调用People();时this输出为Window对象 //但一旦调用newPeople('xx')时,this输出为{name:'xx'} //其实也很好理解,一旦new,便新建了一个对象
实例对象方法只能这样newPeople('leon').introduce();调用因为它使用前必须初始化
类的对象的静态方法
varPeople={};//等于一个对象{}或者function数组都可以此时People需要是引用类型 People.sayhi=function(to_who){ console.log('hi'+to_who); } People.sayhi('lee');//调用时这样调用
原型方法
varPeople=function(){};//People必须为一个function(){}即为一个类,不能是对象或值类型或其他引用类型 People.prototype.meet=function(meet_who){ console.log('Iam'+this.name+',goingtomeet'+meet_who); }; newPeople('lee').meet('xx');
原型方法只能由该类的对象调用
A.prototype=newB();
原型看起来很像继承,但其实不是,它更像clone更准确
如果出现了父类和子类出现了重名的属性,采取就近原则,如果找不到一级一级向上找,如果要指定调用上级的属性,使用call方法
extendClass.prototype=newbaseClass(); varinstance=newextendClass(); varbaseinstance=newbaseClass(); baseinstance.showMsg.call(instance); obj1.func.call(obj);
以上内容是小编给大家分享的学习javascript的闭包,原型,和匿名函数之旅,希望对大家有用。