闭包例子
2019獨角獸企業重金招聘Python工程師標準>>>
<!DOCTYPE html>
<html>
<head>
? ? <meta charset="UTF-8">
? ? <title></title>
</head>
<body>
<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>
轉載于:https://my.oschina.net/u/1992917/blog/412155
總結
- 上一篇: 排错之网络映射缓存凭证记录导致备份计划任
- 下一篇: lr的脚本调试方法