Javascript學習筆記3 函式表示式 閉包

2021-08-16 23:43:47 字數 3032 閱讀 1525

函式宣告提公升:執行**之前會先讀取函式宣告(但是使用函式表示式命名定義函式時,使用前必須賦值

sayhi();     //錯誤,函式還未賦值

var sayhi = function

();

是指有權訪問另乙個函式作用域中的變數的函式

建立函式時,會建立乙個預先包含全域性變數物件的作用域鏈。作用域鏈本質上是乙個指向變數物件的指標列表,它只引用但不實際包含變數物件,這個作用域鏈被儲存在內部的scope屬性中。

全域性環境的變數物件始終存在,而像函式這樣的區域性環境的變數物件,則只會在函式執行過程中存在。

呼叫函式時,會為函式建立乙個執行環境,通過複製函式的scope屬性,構建起執行環境的作用域鏈,接著建立活動變數物件並推入執行環境作用域鏈的前端。
function

makefunc

() return displayname;

}

在另乙個函式的內部定義的函式會將外部函式的活動物件新增到它的作用域鏈中。即使外部函式執行完畢,其也只會銷毀外部函式的作用域鏈,而不會銷毀外部函式的變數物件,因為其變數物件仍然被內部函式引用。只有當內部函式也被銷毀時,外部函式的變數物件才會被銷毀。

因此內部函式可以訪問到外部函式中的變數,這就形成了閉包

var myfunc = makefunc();   //呼叫外部函式,返回內部函式

myfunc(); //"mozilla" 雖然外部函式已經執行完畢,但仍然可以訪問到外部函式中定義的變數

閉包只能取得外部函式中任何變數的最後乙個值(最終值)

function

createfunctions

();

}return result;

}

function

createfunctions

(); }(i);

}return result;

}

匿名函式的執行環境具有全域性性,其this物件通常指向window,但由於閉包,可以會不太明顯

var name = "the window";

var object = ;

};};alert(object.getnamefunc()()); //"the window"

var name = "the window";

var object = ;

};};alert(object.getnamefunc()()); //"my object"

塊級作用域(私有作用域)保證在執行結束後,其中定義的變數將會被銷魂,避免記憶體洩漏和全域性作用域中過多的變數

(function

())()

;

任何在函式中定義的變數,包括函式的引數、區域性變數和在函式內部定義的其他函式叫做私有變數。利用閉包可以訪問到這些私有變數

在建構函式中定義私有變數

function

person

(name);

this.setname = function

(value);

}var person = new person("zjw");

alert(person.getname()); //"zjw"

person.setname("wjz");

alert(person.getname()); //"wjz"

在私有作用域中定義私有變數和函式,與建構函式中定義特權方法的主要區別在於,私有變數和函式是由例項共享的

(function

(); person.prototype.getname = function

(); person.prototype.sayname = function

(value);

})();

var person1 = new person("zjw");

alert(person1.getname()); //"zjw"

person1.setname("wjz");

alert(person1.getname()); //"wjz"

var person2 = new person("zzz");

alert(person1.getname()); //"zzz"

alert(person2.getname()); //"zzz"

上述通過建構函式和原型中定義的特權方法都是針對所有例項的,而對單個物件建立私有變數和特權方法則使用模組模式

var singleton = function

() return

}}();

增強的模組模式(適合那些單例物件必須是某種型別的例項,還必須新增某些屬性和方法的情況)

var singleton = function

() var object = new customdefinetype(); //建立物件

object.publicproperty = true; //公有屬性

object.publicmethod = function

(); return object; //返回這個物件

}();

JavaScript 學習筆記 3

1.建構函式 物件 建構函式是用來初始化物件的。使用關鍵字new來呼叫建構函式建立物件。呼叫建構函式的乙個重要特徵是建構函式的prototype屬性用作新物件的原型。這意味著同乙個 構造函式呼叫的物件繼承自同乙個原型。這意味著它們都是同乙個類的成員。2.類名 建構函式的名字通常用作類名。functi...

JavaScript 學習筆記 3

要建立自己的物件例項,必須首先為其定義乙個建構函式。建構函式建立乙個新物件,賦予物件屬性,並在合適的時候賦予方法。例如,下面的示例為 pasta 物件定義了建構函式。注意this關鍵字的使用,它指向當前物件。pasta是有四個引數的構造器。function pasta grain,width,sha...

javascript高程3 學習筆記 二

ecmascript 函式與其他語言函式最大的不同在於,其不介意傳入多少引數以及引數的型別 比如函式的形參有兩個,但是呼叫函式傳入的引數可以寫乙個,三個或不寫引數 對應undefined 等,解析器都可以正常解析,這是因為 ecmascript中引數在內部是以乙個陣列形式來表示,故而不需要關係傳入引...