一、變數名的提升 JavaScript運行中會經過代碼的預解析和代碼執行過程。 var num=123; function foo(){ console.log(num); //undefined var num=456; console.log(num); //456 } foo(); 代碼預解析 ...
一、變數名的提升
JavaScript運行中會經過代碼的預解析和代碼執行過程。
var num=123;
function foo(){
console.log(num); //undefined
var num=456;
console.log(num); //456
}
foo();
代碼預解析過程會將變數聲明和函數聲明提升。如下:
var num;
function foo(){
var num;
console.log(num); //這裡因為num只聲明瞭,但是沒有定義所以列印是undefined,並且這裡找到的是函數foo中聲明的變數,不是全局中的num。
num=456;
console.log(num); //這裡由於給num賦值為456,所以列印456
}
num=123;
foo();
二、閉包的使用和功能
①閉包是為了實現私有訪問的函數。
②寫一個函數內定義一個新的函數,返回新函數,用新函數獲得函數內的數據。
③寫一個函數內定義一個對象,對象中綁定了多個函數,返回對象,利用對象的方法訪問函數內的數據。
④過多使用閉包會造成記憶體泄漏,所以,當我們不再使用一個閉包的時候,將其賦值為null。
1、返回對象來達到獲取函數內部的數據,並且修改:
function foo(){
var num=Math.random();
return {
get_num:function(){
return num;
},
set_num:function(value){
num=value;
}
};
}
var o=foo();
var num1=o.get_num(); var num2=o.get_num(); console.log(num1); //a,a代表隨機數,下麵的a表示相同的隨機數 console.log(num2); //a num1=o.set_num(5); //這裡調用修改了num1作用域鏈中的數據,但是num2和num1是兩條不同的作用域鏈,因此,num2中的數據沒有發生變化。 console.log(num1); //5 console.log(num2); //a 上面這個功能不使用對象也能完成: function foo(){ var num=Math.random(); return function(value){ if(value){ num=value; return num; }else{return num;} } } var o=foo(); var num1=o(); var num2=o(); console.log(num1); console.log(num2); num1=o(5); console.log(num1); console.log(num2); 結果與上面返回對象一樣。