1. 程式人生 > >jquery的變數作用域和作用域鏈的使用

jquery的變數作用域和作用域鏈的使用

  1、函式變數的作用域有全域性變數和區域性變數兩種,全域性變數寫在函式的最前面,區域性變數寫在函式體內,區域性變數省略了var 也就預設成為了全域性變數!
    2、函式體內部可以讀取到函式外的變數,而函式外不能讀取到函式內的變數!

每次呼叫viewMoreComment 方法的時候。在外面定義的變數還會接著上次呼叫方法時候的count與i的值

/**
 * 檢視更多評論
 */
var count=0;
var i = 1;
var viewMoreComment = function(){
	i+=1;
	count=i*10+1
	start = (i-1)*10;
	var params = {
			adviceId:$("#adviceId").val(),offset:start,limit:count
	}
	var url = CONTEXT_PATH + "/advice/viewMoreComment";
	$.ajax({
		type:"post",
		url :  url,
		data : params, 
		cache:false,
        async:false,
        dataType:"json",
		success : function(retData){
			if(retData.length==0){
				$("#moreComment").hide();
			}
			var ret = retData;
			var tpUrl = CONTEXT_PATH+'/view/gateway/images/user.png';
			for(var i=0;i<ret.length;i++){
				$("#morecommentList").append("<li><img src='"+tpUrl+"'>" +
						                      "<p><span>"+ret[i].commentPeopleName+"</span><span>"+ret[i].commentTime+"</span></p>" +
						                      "<div>"+ret[i].content+"</div>"+
				                              "</li>");  
			}
		}
	});



	}

作用域鏈

如果變數是在函式內宣告的,那麼的作用域僅在函式內,函式之外不能呼叫。函式呼叫執行完後,函式內的變數立即銷燬

如果變數是在函式外宣告的,它的作用域是全域性的,也叫全域性變數。在頁面被瀏覽器載入後,全域性變數一直存於記憶體中,直到頁面被關閉才銷燬。

作用域是針對變數的,比如我們建立了一個函式,函式裡面又包含了一個函式,那麼現在就有三個作用域

  全域性作用域==>函式1作用域==>函式2作用域

作用域的特點就是,先在自己的變數範圍中查詢,如果找不到,就會沿著作用域往上找。

var a = 1;
function b(){
    var a = 2;
    function c(){
        var a = 3;
        console.log(a);
    }
    c();
}
b();

最後打印出來的是3,因為執行函式c()的時候它在自己的範圍內找到了變數a所以就不會越上繼續查詢,如果在函式c()中沒有找到則會繼續向上找,一直會找到全域性變數a,這個查詢的過程就叫作用域鏈。

不知道你有沒有疑問,函式c為什麼可以在函式b中查詢變數a,因為函式c是在函式b中建立的,也就是說函式c的作用域包括了函式b的作用域,當然也包括了全域性作用域,但是函式b不能向函式c中查詢變數,因為作用域只會向上查詢。

那麼什麼是原型鏈呢?

  原型鏈是針對建構函式的,比如我先建立了一個函式,然後通過一個變數new了這個函式,那麼這個被new出來的函式就會繼承創建出來的那個函式的屬性,然後如果我訪問new出來的這個函式的某個屬性,但是我並沒有在這個new出來的函式中定義這個變數,那麼它就會往上(向創建出它的函式中)查詢,這個查詢的過程就叫做原型鏈。

  Object ==> 建構函式1 ==> 建構函式2

  就和css中的繼承一樣,如果自身沒有定義就會繼承父元素的樣式。

function a(){};
a.prototype.name = "追夢子";
var b = new a();
console.log(b.name); //追夢子