首頁 > web前端 > js教程 > 學習javascript的閉包,原型,和匿名函數之旅

學習javascript的閉包,原型,和匿名函數之旅

PHPz
發布: 2018-09-28 16:54:23
原創
1073 人瀏覽過

本文透過範例為大家介紹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插件的定義時很常見

1.通過函數字母量的方式. 先宣告一個匿名函數,然後執行它
( function(){
  console.log('excute self');
}) ();
登入後複製

2.透過優先表達式的方式, 由於Javascript執行表達式是從圓括號裡面到外面,所以可以用圓括號強制執行宣告的函數
(
  function () {
    alert(2);
  }
  ()
);
登入後複製

3.void運算子用void運算子去執行一個沒有用圓括號包圍的一個單獨操作數
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 ,便新建了一个对象
登入後複製
理解js中的protitype首先需要明白js的物件導向設計

實例物件方法只能這樣new People('leon').introduce(); 呼叫因為它使用前必須初始化
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();

 A.prototype = new B();
extendClass.prototype = new baseClass();
var instance = new extendClass();
var baseinstance = new baseClass();
baseinstance.showMsg.call(instance);
obj1.func.call(obj);
登入後複製
原型看起來很像繼承,但其實不是,它更像clone更準確

如果出現了父類和子類出現了重名的屬性,採取就近原則,如果找不到一級一級向上找,如果要指定呼叫上級的屬性,使用call方法

以上內容是小編給大家分享的學習javascript的閉包,原型,和匿名函數之旅,希望對大家有用,更多相關教學請上JavaScript影片教學!
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板