var num = 12; var obj = { name:"houdashuaige", age:18 }; function fn() { console.log("好好學習 每天向上"); } console.log(fn) //把整個函數定義的部分(函數自己)在控制檯輸出 console.log(fn()) //輸出當前函數的執行返回結果 fn()//return 後面是啥 返回啥 若是沒有return 返回undefined
若是執行obj.age = 20; 首先經過地址xxxfff000 找到對應的空間 而後把空間中age屬性對應的屬性值修改成20; 其中fn存儲的是一個地址 表明的時當前函數的總體
在當前的做用域中,JS代碼執行以前,瀏覽器首先會默認地把全部帶var、function的進行提早的聲明或者定義
var num = 12; 聲明: var num; //告訴瀏覽器在全局做用域中有一個num的變量 定義: num = 12(發生在代碼執行過程當中 不在預解釋中); //給變量進行賦值 function fn() { console.log("this is a test"); } 函數預解釋 fn = xxxfff000; 聲明: fn //告訴瀏覽器在全局做用域中有一個fn的函數 定義: fn = xxxfff000; //給fn賦值 指向函數的地址
註釋: 因此對於帶var 和 function關鍵字的在預解釋的時候操做仍是不同的javascript
**var: 對於帶var的變量 預解釋只會聲明 不會進行定義** **function: 在預解釋的時候聲明+定義 一塊兒完成了**
//函數只有在執行的時候纔會對函數內部的代碼進行預解釋 console.log(num);// undefined 提早聲明 但未定義 默認undefined var num = 12; console.log(num);// 12 var obj = { name: "hou", age: 7 }; fn(100,200);//代碼能夠在這執行 由於預解釋的時候 聲明+名義就已經完成了 function fn(num1,num2) { var total = num1 + num2; console.log(total); }
function fn(num1,num2) { var total = num1 + num2; console.log(total); }
//棧內存:用來提供一個供JS代碼執行的環境 --->做用域(全局做用域/私有做用域) //堆內存:用來存儲引用數據類型的值 --->對象存儲的時屬性名和屬性值 //函數存儲的是代碼字符串
註釋: 下述都是爲了更好地理解"函數預解釋",請耐心閱讀java
console.log(num);--->undefined var num = 12; console.log(num2); --->直接報錯 由於num2沒有預解釋 num2=13;
var num = 12; console.log(num);//12 num2 = 12; console.log(num2) //12 --->至關於window.num2 //關係:num2 = 12 --->至關於給window增長了一個叫num2的屬性名,屬性值是12 //var num =12 --->至關於給全局做用域增長了一個全局變量num,可是不只如此, //它也至關於給window增長了一個屬性名num,屬性值是12
var total = 0; function fn() { console.log(total) // 0 total = 100;//至關於修改了全局變量total } fn(); console.log(total)//--->100 //註釋:私有做用域中出現的一個變量不是私有的,則往上級做用域查找,上級沒有則繼續向上查找,一直找到window //若是window下沒有 分兩種狀況: //一、若是是獲取值:console.log(total) -->直接報錯 //二、若是是設置值:total = 100;--->至關於給window加了total屬性 //三、JS中若是在不進行任何特殊處理的狀況下,上邊的代碼報錯,下邊的代碼都不執行了
if(!("num" in window)) { //===>if(false) var num = 12; } console.log(num);//--->實際輸出undefined //分析:無論if的條件是否成立 都會把帶var的進行預解釋 (var num = 12) //因此"num" in window 是true !("num" in window) --->false //if條件是false var num = 12 不會執行 因此 console.log(num) 是undefined
把函數定義的部分看成一個值賦給咱們的變量/或者賦給元素的某一個事件瀏覽器
fn();//====>fn 是undefined 至關於 undefined() 報錯 uncaught TypeError: fn is not a function //window下的預解釋 var fn; 預解釋的時候只會預解釋 "="(等號)左邊的 //右邊的是值 不參與預解釋 var fn = function() { console.log("ok"); }
定義和執行一塊兒完成的閉包
//自執行函數定義的那個function在全局做用域下不進行預解釋,當代碼執行到這個位置的時候,定義和執行一塊兒完成了 //自執行函數的5種形式 (function(num){})(100);//經常使用形式 ~function(){}(100); +function(){}(100); -function(){}(100); !function(){}(100)
function fn() { console.log(num);//--->undefined return function() {}; var num = 100; } fn(); //函數體種return 下面的代碼雖然再也不執行了,可是須要進行預解釋 //return 後邊跟着的是咱們的返回值,因此不進行預解釋
//註釋:在預解釋的時候,若是名字已經聲明過了,不須要從新聲明,可是須要從新定義(賦值) //JS比較懶,聲明過一次,便再也不聲明,可是能夠從新定義 //在JS中,若是變量的名字和函數的名字重複了,也算衝突 fn(); function fn() {console.log(1)}; fn(); var fn = 10; fn(); function fn() {console.log(2)}; fn(); //輸出結果是2 、2 、 報錯:fn is not a function 後邊代碼不執行
(本身畫預解釋圖 學習 分析會更快 更有效)
函數