arguments、做用域(變量、詞法)、變量提高、函數內部this指向、匿名函數和當即執行

01.arguments

1.參數個數不肯定!!!

2.arguments對象

存放函數內部全部的參數數組

arguments.length 記錄着所傳遞參數的個數函數

arguments 存放參數的形式相似於數組,可是arguments不是數組this

arguments 取出裏面存放的數據,經過下標,下標是從0開始的。arguments[0];spa

若是把arguments存放的數據所有取出,須要循環遍歷!!!code

1.查看arguments對象

function fn(){
   console.log(arguments);
}
fn(2,2,3);

2.獲取參數個數索引

function fn(){
  console.log(arguments.length);
}
fn(2,3,32,32);

3.取arguments裏面的值(索引,從0開始)token

function fn(){
console.log(arguments[3]);
}
fn(2,3,4,23);

02.arguments練習

1.定義一個加法功能,計算傳入的全部數字的和 
function fn(){
var sum = 0;
//循環遍歷
for(i = 0 ; i < arguments.length ; i++){
sum += arguments[i];
}
return sum;
}
console.log(fn(1,2,3,4,4,5));
2.定義一個功能getMax,傳入任意個數字,返回最大值
function getMax(){
   //假設arguments[0]最大
   var maxNum = arguments[0];
   for(i = 1 ; i < arguments.length ; i++){
       if(maxNum < arguments[i]){
           maxNum = arguments[i];
      }
  }
   return maxNum;
}
console.log(getMax(3,4,24,534,2,2,4));
3.定義一個運算功能,參數爲(x,y),當傳入1個數字時,求x的階乘,若是傳入兩個數字,求x的y次方
function fn(x,y){
   if(arguments.length == 1){
       var product = 1;
       for(i = 1 ; i <= x ; i++){
           product *= i;
      }
       return product;
  }
   return (Math.pow(x,y));
}
//console.log(fn(2));
console.log(fn(3,2));

03.做用域思考

//思考1:
var a = 10;
function fn(){
   console.log(a);   //10
}
fn();

//思考2:
var a = 10;
function fn(){
   var a = 20;
   console.log(a);    //20
}
fn();

//思考3:
var a = 10;
function fn(){
   var a = 20;
   console.log(a);    //20
}
console.log(a);     //10
fn();


//思考4:
function fn(){
   var a = 10;
   console.log(a);           //10
}
fn();
console.log(a);      //a is not defined;

//思考5:
var a = 10;
function fn(){
   console.log(a);     //變量提高了 undefined;
   var a = 20;
   console.log(a);    //20
}
fn();
//執行過程
function fn(){
   var a;
   console.log(a);     //undefined;
   a = 20;
   console.log(a);   //20
}

//思考6
var a = 10;
function outerFn(){
   console.log(a);   //undefined;
   var a = 20;
   function innerFn(){
       var a = 30;
       console.log(a);   //30
  }
   innerFn();
   console.log(a);   //20
}
outerFn();
console.log(a);    //10
//執行過程:
var a = 10;
function outerFn(){
   var a;
   console.log(a);   //undefined;
   a = 20;
   function innerFn(){
       var a = 30;
       console.log(a);   //30
  }
   innerFn();
   console.log(a);    //20
}
outerFn();
console.log(a);   //10

04.變量的做用域

(ES6沒有做用域,只有在函數裏面的做用域)事件

1.函數的做用域

全局變量作用域

局部變量

2.變量的關係

  1. 寫在函數內部的叫作局部變量

  2. 在全局不能訪問局部變量

  3. 在局部能訪問全局變量

  4. 函數在不調用的時候,局部變量是不存在的

  5. 在函數運行完畢以後,變量被垃圾回收機制回收!

3.做用域鏈

根據函數內部能訪問函數外部變量的這種關係,逐層向外查找變量的過程,叫作變量的做用域鏈

當前做用域——> 父級做用域 ——>...——>全局做用域 造成的做用域鏈條

eg:做用域
var a = 10;
function fn1(){
   var a = 20;
   fn2();
   function fn2(){

       // console.log(a);   //20(做用域鏈,逐層向外查找)

       // var a = 30;   // undefined (變量提高)

       var a = 30;
       console.log(a);   //30

  }
}
// console.log(a);   //10
//console.log(fn1());   //undefined
//console.log(fn2());   //fn2() is not defines;
fn1();

eg:做用域鏈
var a = 20;
function fn1(){
   var a = 10;
   function fn2(){
       console.log(a);     //10
  }
   fn2();    
}
fn1();
console.log(window.a);    //20

05.詞法做用域

1.詞法做用域(靜態做用域)

做用域:在函數聲明過程當中產生

2.動態做用域:

在函數調用的時候產生做用域,動態做用域!

3.js裏面函數的做用域:是在聲明時候產生的仍是在調用的時候產生的??

在函數聲明的時候產生。

4.js的執行環境:

每一個函數的執行都會產生一個執行環境:全局執行環境是外圍的執行環境,全局執行環境被認爲是window對象,所以全部的全局變量和函數都做爲window對象的屬性和方法建立的。

eg:
var a = 10;
function fn1(){
   console.log(a);   //10;
}
function fn2(){
   var a = 20;
   fn1();
}
fn2();

06.變量的提高

1.js的解析過程:

  1. 預編譯(預解析)

    a:對語法的檢測。若是有語法錯誤,直接報錯。(Uncaught SyntaxError: Unexpected token ,)

    b:變量提高

  2. 執行

2.變量提高

  1. 把聲明的變量var a;都提高到當前做用域的最頂端

  2. 賦值語句和邏輯語句都不提高,原地等待執行

  3. function關鍵字聲明的函數也會提高到做用域的最頂端

  4. 變量提高的規則:全部用var聲明的變量先提高,而後再提高function聲明的函數總體。(官方解釋:函數的執行權重比較高)

  5. 匿名函數不會被提高

eg:
//第一組
var fn = 10;
function fn(){

}
console.log(fn);    //10;

//執行過程爲:
var fn;
function fn(){

}
fn = 10;
console.log(fn);



//第二組:
console.log(a);    //a is not defined;



//第三組:
console.log(a);
var a = 10;     //undefined;

//執行過程爲:
var a;
console.log(a);
a = 10;

//第四組
console.log(fn);      
function fn(){

}                 //fn(){}

//執行過程爲:
function fn(){

}
console.log(fn);

//第五組:
var fn = 10;
var fn = function(){

}
console.log(fn);   //fn(){}由於fn就將上面的fn覆蓋的。

//第六組:
var n = 10;
function test(){
   console.log(n);   //undefined;
   var n = 20;
   console.log(n);   //20
}
test();

box.onclick = function(){

}

07.變量的補充

變量的泄露

eg:
1.window.a = 10;
function fn(){
   window.a = 20;
   console.log(a);      //undefined;   //下面的變量進行變量的提高爲,undefined;
   var a = 30;
   console.log(a);      //30
}
fn();
console.log(a);            //20   //變量的泄露window.a = 20 泄露出去覆蓋了window.a = 10;

//執行過程爲:
window.a = 10;
window.a = 20;
function fn(){
   var a;
   console.log(a);  //undefined;
   a = 20;
   var a =30;
   console.log(a);    //30
}


2.a = 10;
function fn(){
   a = 20;
   console.log(a) ;   //20;   將變量提高到當前做用域最頂端
   a = 30;
   var a = 30;
   console.log(a);   //30
}
fn();
console.log(a);    //10

08.函數的內部this指向

函數裏面的this指向:

誰調用函數,this就指向誰!!

事件驅動:給誰綁定事件,this指向誰

function fn(){
   console.log(this);   //window;
}
fn();


// links.onclick = function(){
//     console.log(this);   //<a href="#" id = "links">DSF</a>
// }


// document.onclick = function(){
//     console.log(this);   //document;
// }

09.匿名函數和當即執行

//用括號括起來,而後前面加上分號;
function fn(){}
;(function(){  //加分號,防止影響上面的

})();
相關文章
相關標籤/搜索