本文透過範例為大家介紹javascript的閉包,原型,和匿名函數,詳情請看下文。
一、關於閉包
理解閉包所需的知識
1.變數的作用域
例1:
var n =99; //建立函数外的全局变量 function readA(){ alert(n); //读取全局变量 }
readA(); //執行此函數
例2 :
function readB(){ var c = 9; function readC(){ console.log(c); //ok c可见 } return readC; } alert(c); //error c is not defined.
note: 函數內部宣告變數c時,一定要加上var,否則c會成為一個全域變數
所以函數內可見全域變數,函數內的局部變數卻對外不可見
js的作用域是鍊式的,父物件裡的變數總對子物件可見,子物件的物件卻對父物件不可見
當我們要取得函數內的內部變數
於是有了例3:
function readB(){ var c = 9; function readC(){ console.log(c); } return readC(); } readB();
閉包很類似基於此做了一個變式
function readB(){ var c = 9; function readC(){ console.log(c); } return readC; } var res = readB(); res();
note:
1.慎用閉包,注意記憶體佔用,因為它會保存父函數的狀態
2.不要隨便改變父函數內部變數的值
理解閉包
note: this 指包含它的函數被執行時所屬的物件
例1:
var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ //此时this (这个执行函数)是属于object对象的,是object对象下的一个属性的值 return function(){ //此时this (这个执行函数)是一个匿名函数,从根对象window生成,是属于window return this.name; }; } }; console.log(object.getNameFunc()()); //the window
例2:
var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ var that = this; return function(){ return that.name; }; } }; console.log(object.getNameFunc()()); //My Object
二.匿名函數
直接定義一個匿名函數然後調用這個匿名函數,這種形式在jquery插件的定義時很常見
( function(){ console.log('excute self'); }) ();
( function () { alert(2); } () );
void function(){ console.log('void') } ();
三.關於prototype
原型prototype
function People(name){ this.name = name; console.log(this); //Window 或者 object { name: 'xxx' } this.introduce = function(){ //实例对象方法 console.log(this.name); } } new People('leon').introduce(); //这里有一个非常有趣的现象,结合前面的来看的话, //首先function people里的this指向的默认是Window对象 //当 调用 People();时 this 输出为 Window对象 //但一旦调用new People('xx')时, this 输出为 {name:'xx'} //其实也很好理解,一旦new ,便新建了一个对象
var People = {}; //等于一个对象 {} 或者 function 数组都可以 此时People需要是引用类型 People.sayhi = function(to_who){ console.log('hi '+ to_who); } People.sayhi('lee'); //调用时这样调用
var People = function(){}; // People 必须为一个 function(){} 即为一个类,不能是对象或值类型或其他引用类型 People.prototype.meet = function(meet_who) { console.log('I am '+this.name + ',going to meet ' + meet_who); }; new People('lee').meet('xx');
原型方法只能由該類別的物件呼叫
A.prototype = new B();
extendClass.prototype = new baseClass(); var instance = new extendClass(); var baseinstance = new baseClass(); baseinstance.showMsg.call(instance); obj1.func.call(obj);
如果出現了父類和子類出現了重名的屬性,採取就近原則,如果找不到一級一級向上找,如果要指定呼叫上級的屬性,使用call方法
以上內容是小編給大家分享的學習javascript的閉包,原型,和匿名函數之旅,希望對大家有用,更多相關教學請上JavaScript影片教學!