Javascript 閉包與範圍,javascript範圍
今天來說下javascript的範圍及閉包使用。先說下範圍的概念,各種開發語音都會遇到變數的生命週期,使用範圍,使用範圍其實就是變數的範圍,字面意思理解就是這個變數在那段代碼區間內有效。
1、.Javascript的範圍是函數範圍而非塊級範圍,看代碼:
(function(){ var i=1; if(i==1){ var j=3; } console.log(j); //在這裡可以訪問 })()
在這裡,j是可以訪問的,也就是說在一個函數中的任何位置定義的變數在該函數中的任何地方都是可見的,再看另一種情況:
function a(){ function b(){ //code }}b方法同樣可以使用a方法中聲明的變數,原理同上。
2.Javascript中變數的範圍分為全域變數和局部變數,看代碼:
var p=11;function f1(){ console.log(p);}f1(); //11在方法體外部聲明的變數為全域變數,該變數在任何方法中都可訪問。再看下另外一種全域變數聲明方式:
function f1(){ p=11;}f1();console.log(p); 由於p=11在方法體中聲明,相當於已經有了p這個全域變數,所以這種聲明方式也可以,但不推薦使用。
3.那如何訪問函數內部的變數並對它進行操作呢?這裡就需要用到閉包
先看看閉包的官方解釋:閉包是一個擁有許多變數和綁定了這些變數的環境的運算式(通常是一個函數),因而這些變數也是該運算式的一部分
看到這句戶我不禁想問,這是個啥?
後來參考了一些部落格和《Javascript秘密花園》才開始理解,閉包大概就是函數內部的一個函數被外部調用,這樣就可以調用內部變數了,比如下面這段
function f1(){ var p=11; return { increment: function() { p++; }, show: function() { alert(p) } }}var f=f1();f.show(); //11f.increment();f.show(); //12這種方式類似於java bean中對於private 變數的get set方法。
javascript中閉包與範圍問題
vartimeout = setInterval(function(){
$('button#mybutton').click(function(){
clickCount ++;
});
time --; //計時
},oneSecond);
這個部分會添加多個$('button#mybutton').click,並且沒看到你unbind這個事件,必定會出現問題的。
略有些混亂了
javascript閉包的問題,詳解
js閉包的問題其實就是js的變數範圍的問題,js有兩種範圍,全域範圍和函數範圍, 全域範圍就不說了, 閉包其實是函數範圍衍生的一個特性.因為每個函數內都是一個範圍, 所以就會有一個範圍鏈存在,還是舉例說明吧:
var a = "a";
function test0 () {
var b = "b";
function test1 () {
var c = "c";
return a + b + c;
}
}
這樣就會有一個範圍鏈存在 全域範圍==>test0函數範圍==>test1函數範圍, 這樣test1函數裡可以取到test0中和全域變數的值,也就是可以取到a和b的值, test0函數中可以取到全域的變數的值,也就是說範圍鏈後面的可以取到前面的值. 其實閉包說的就是範圍鏈的這個特性.
不過一般閉包都是用在匿名函數上, 上面的函數可以修改為下面的
var a = "a";
function test0 () {
var b = "b";
return function() {
var c = "c";
return a + b + c;
}
}
test0()(); //=>"abc"
純手打,希望對你有協助