在開始之前先寫一下js中的數(shù)據(jù)類型
. 基本數(shù)據(jù)類型 number如蚜, boolen 压恒,string ,null错邦, undefined
. 對象數(shù)據(jù)類型 object {} [] /$/,date (對象探赫,數(shù)據(jù)撬呢,正則伦吠,日期) ,function
拋出問題:
console.log(num);
console.log(fn);
console.log(fn());
var num =12 ;
var obj ={
name: "rapheal",
age:"20"
}
function fn(){
console.log("我是執(zhí)行結果");
return "";
}
console.log(num);
console.log(fn);
console.log(fn());
執(zhí)行結果是
- 為什么第一次num 是 undefined 而 fn 不是魂拦?
作用域
書面解釋: 作用域是指程序源代碼中定義變量的區(qū)域。我覺得更好的解釋是內(nèi)存中開辟的一段內(nèi)存空間芯勘。
函數(shù)的作用域在函數(shù)定義的時候就決定了潭千。(不理解后面會有解釋)
當html頁面加載的時候,瀏覽器首先會提供一個全局的js 執(zhí)行的作用域, 也就是 window 對象(NODE的 global對象)
預解釋
預解釋 也叫變量提升
在當前作用域中在js 執(zhí)行之前,瀏覽器會默認的先把所有var 和function 進行提前聲明或者定義
(1)聲明和定義
聲明: var num ; 告訴當前作用域有一個num 的對象; 但是該對象是沒有定義的是undefined掉冶;
定義:給變量賦值 num = 12真竖;
(2)var和 function 在預解釋的時候進行的操作上還是不一樣的,
var在在預解釋的時候只進行了變量聲明
function 在預解釋的時候 聲明和定義都完成了
到目前為止 就能解釋 文章開始的時候提出的問題了璧亚。讨韭。。
(3) 預解釋 只發(fā)生在當前作用域下面癣蟋,頁面開始的時候只對window 下面的進行預解釋透硝,函數(shù)內(nèi)部的 代碼只有執(zhí)行的時候才開始預解釋
預解釋的特點
- 預解釋中如果有條件,無論條件是否成立疯搅,都會把 帶var 的變量進行提前聲明 如下demo 輸出的 undefined
if(!('num' in window)){
var num =12 ;
}
console.log(num); // 輸出 undefined
- 預解釋的時候只預解釋 '='左邊的濒生,右邊的是值不參與預解釋
// fn2(); //Uncaught TypeError: fn2 is not a function
// var fn2 =function () {
// console.log('fn2');
// }
// fn();
// function fn() {
// console.log('fn');
// }
// fn();
3.自自行函數(shù)在全局作用域下不進行預解釋,當代碼執(zhí)行到位置的時候定義和執(zhí)行一起完成
4.函數(shù)體 return 下面的代碼雖然不執(zhí)行幔欧,但是需要進行預解釋,return 后面跟的都是我們的返回值罪治,所有不進行定義
function fn3() {
console.log(num3); //=> undefined
return function () {
};
var num3 = 100;
}
fn3();
作用域
剛才說頁面加載 js 代碼執(zhí)行的時候 會有一個全局的作用域。
私有作用域: 函數(shù)執(zhí)行的時候會生成一個私有的作用域琐馆。
全局變量: 在全局作用域下聲明的變量是全局變量
私有變量: 在"私有作用域的聲明的變量"和"函數(shù)的形參"都是私有變量
作用域鏈:在私有作用域中规阀,我們的代碼執(zhí)行的時候遇到一個變量,首先我們需要確定它是否是私有變量瘦麸,如果是私有變量谁撼,那么和外面的沒有任何關系,如果不是私有的滋饲,則往當前作用域的上級作用域查找厉碟,如果上級作用域也沒有則繼續(xù)查找,一直找到window 為止 屠缭;箍鼓,,呵曹,款咖,(作用域鏈)
作用域特點
(1) 在全局作用域中何暮,帶var 和不帶var 的區(qū)別
// 區(qū)別 :帶var 的是可以進行預解釋的,所以在賦值前面執(zhí)行不會報錯铐殃,不帶var 的是不能進行預解釋的海洼,在前面執(zhí)行會報錯;
// 關系: num2=12 =》 相當于給window 增加了一個叫做num2的屬性名富腊,屬性值是12
console.log(num); //undefined
console.log(num2); //Uncaught ReferenceError: num2 is not defined
var num=1;
num2 = 10;
(2)私有作用域中出現(xiàn)一個不是私有的變量坏逢,則往上級作用域查找,一直找到window 為止赘被,如果window 下也沒有,會在window 作用域增加一個變量
function fn() {
console.log(total);
total =10;
}
fn();
(3)看當前函數(shù)是在哪個作用域下定義的是整,那么他的上級作用域就是誰 和函數(shù)在哪執(zhí)行的沒有任何關系
var num = 12;
function fn() {
var num =120;
return function () {
console.log(num);
}
}
var f= fn();
f();
!function () {
var num = 1200;
f();
}()
先寫這么多吧,有什么問題大家一塊討論民假。浮入。。阳欲。