<!DOCTYPE html>html
<html>閉包
<head>函數
<meta charset="UTF-8">設計
<title></title>htm
</head>對象
<body>ip
<script>內存
//設計一個函數達到這樣的效果fun(1)()()每加一個括號傳入的值都自動加1,最後輸出這個值。談談你對重寫對象的valueOf,toString後,valueOf,toString調用順序的理解,以及你對閉包得出理解。作用域
var counterObj = {};字符串
counterObj.count =function(i){
function countInner(){
i++;
return countInner;
}
countInner.valueOf = function(){
console.log('valueOf');
return i;
}
countInner.toString = function(){
console.log('toString');
return i;
}
return countInner;
}
var result = counterObj.count(2)()(); //result爲countInner函數
result()()();
console.log(result) //這裏要顯示字符串,所以會先調用countInner的toString方法;但此處輸出結果後又調用了valueOf方法,對此不是很理解
//1. 在須要進行表達式運算時會先求值,所以會調用valueOf,若是沒有重寫valueOf,會調用toString
//2. 在須要進行字符串顯示時會調用toString,若是沒有重寫toString,也不會調用valueOf
//3. 強制使用String(),會調用toString方法,若是沒有重寫toString,也不會調用valueOf;強制使用Number()會調用valueOf方法,若是沒有重寫valueOf,會調用toString
//4. 閉包,即函數裏面嵌套函數,因爲做用域鏈,內層函數能夠訪問外層函數的局部變量;一般狀況下,當一個函數調用完後,js的垃圾回收機制,會釋放函數內部局部變量的內存空間,可是當造成閉包
// 而且將內層函數返回並賦給另外一個變量時,此時js垃圾回收機制不知道咱們什麼時候會引用此變量,所以不會回收內層函數內引用的外層函數局部變量的內存空間,此時咱們能夠在函數外面操做函數內部的局部變量。
</script>
</body>
</html>