最近項目裏涉及到關於js方面的知識,花了點時間研究下,遂記錄下來:
先來點開胃小知識:
1>全局變量和局部變量
全局變量:非局部變量就是全局變量,且在引入的多個js文件中通用。
局部變量:定義在方法內部的變量,函數的形參也屬於。
在方法內部定義變量,一定要加var,否則會被定義爲全局變量,例子如下:
var B = A(2);
B(10);
function A(x) {
temp = 3;
return function (y) {
alert(x+y+(++temp));
}
}
alert(temp); //這裏會輸出4,因爲temp是全局變量。
//注意:如果將代碼裏的頭兩行去掉,那麼alert會報錯,顯示undefined,不是說temp是全局變量嗎,怎麼未定義?
//這是因爲 函數內部定義的變量,要在函數執行後纔會真正定義
//這段代碼內部執行情況是:執行A,發現一個沒有用 var 定義的 temp 於是去全局變量中尋找是否有這個變量,結果沒有,那麼我就創建一個temp全局變量。
2> js中什麼可以作爲if的條件?
1.布爾變量 true/false;
2.數字非0 (負數也是可以的) 爲true
數字是0或者NaN 爲false
3.字符串爲非空串 爲true
重點來了
3>關於閉包的研究和理解。
$(function () {
function a() {
var i = 999;
return function () {
return i++;
}
}
var c = a(); //c指向了匿名函數function(){return i++} ,因此內部函數被a外一個變量應用。使得a一直存在。
var x = c(); //x指向i。
alert(x);
x = c();
alert(x);
/*
閉包的本質,就是可以讀取其他函數內部變量的函數。
閉包的第一種形式:
當一個函數返回的是他內部的函數的時候 那麼就是一個閉包。
當函數a的內部函數b 被函數a外的一個變量c引用的時候,就創建了一個閉包c
閉包的作用:使得a執行完畢後,GC不會回收a所佔用的資源。
閉包的應用場景:1.在內存中維持一個變量,由於閉包c的存在,a中變量i可以一直維持。每次執行完c i會自動加1;
2.通過保護變量安全時限js私有屬性和私有方法。 */
上述代碼中c就是一個閉包,或者說 return (){return i++} 就是一個閉包,正是由於這個閉包的存在,使得a在執行完之後,並不會被GC回收,而是保存在內存中,如它的變量 i 一值存在,所以運行一次c() i 就加 1 。
閉包的第二種形式。
閉包:函數可以調用函數之外的變量。
var a="a"
var n;
var bFn=function(){
alert("a");
alert("b");
n=function(){
var c="c";
alert(c);
}
}
n(); //n函數屬於全局域,但可以調用bFn中的b,因爲n指向它的內部函數。
其他關於很複雜的閉包例子什麼的,還等着繼續理解。
這是參考的一個博客:
http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html