Javascript闭包(Closure)
生活随笔
收集整理的這篇文章主要介紹了
Javascript闭包(Closure)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.Javascript特殊的變量作用域。
變量的作用域無非就是兩種:全局變量和局部變量。
Javascript語言的特殊之處,就在于函數內部可以直接讀取全局變量。
function f1() {
var n = 999;
}
alert(n); // error沒有變量n
函數內部聲明變量的時候,一定要使用var命令。如果不用的話,你實際上聲明了一個全局變量!
function f2() {
n = 999;
}
f2();
alert(n); //
2.Javascript語言特有的"鏈式作用域"結構(chain scope),
子對象會一級一級地向上尋找所有父對象的變量。
父對象的所有變量,對子對象都是可見的,反之則不成立。
3.什么是閉包:
當內部函數在定義它的作用域的外部被引用時,就創建了該內部函數的閉包
這個不是閉包
function f3(x) {
var temp = 3;
function bar(y) {
temp = temp + 1;
alert(x + y + temp);
}
bar(10);
}
f3(2) //2+10+4=16; 不管執行多少次,都會alert 16,因為bar能訪問foo的參數x,也能訪問f3的變量tmp。這個不是閉包
閉包
function f4(x) {
var temp = 3;
return function (y) {
temp = temp + 1;
alert(x + y + temp);
}
}
var bar = f4(2); // bar 現在是一個閉包
bar(10);//第一次16,第二次17,每次自動加1
f4(2)(10); //這個每次都是16,因為每次都是一個新的對象,這個對象是不存在的,與上面的區別是上面的已經存在。
function f5() {
var n = 999;
nAdd = function () { n += 1 } //nAdd前面沒有使用var關鍵字,因此nAdd是一個全局變量,而不是局部變量
function f6() {
alert(n);
}
return f6;
}
var result = f5();
result(); //
nAdd();
result(); //
var name = "The Window";
var object = {
name: "My Object",
getNameFunc: function () {
alert(this.name); //My Object
return function () {
return this.name; //當前的name,沒有的話當成全局變量
};
}
};
alert(object.getNameFunc()()); //The Window
var name = "The Window";
var object = {
name: "My Object",
getNameFunc: function () {
var that = this;
return function () {
return that.name;
};
}
};
alert(object.getNameFunc()());//My Object
4.閉包的注意點:
1)由于閉包會使得函數中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題,在IE中可能導致內存泄露。解決方法是,在退出函數之前,將不使用的局部變量全部刪除。
2)閉包會在父函數外部,改變父函數內部變量的值。所以,如果你把父函數當作對象(object)使用,把閉包當作它的公用方法(Public Method),把內部變量當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函數內部變量的值。
總結
以上是生活随笔為你收集整理的Javascript闭包(Closure)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VVDocumenter规范注释生成器
- 下一篇: 树莓pi快速ssh【校园网】