(一)函式
定義:可以重複呼叫執行的**塊
一 函式的宣告和呼叫
1.宣告函式
(1)命名函式
語法:function 函式名( )
(2)函式表示式來宣告函式(匿名函式)
語法:var 變數名=function();
eg:var fun=function()
fun();//使用變數名來呼叫函式
2.呼叫函式
函式名();
二 函式的引數
function 函式名(形參1,形參2……)
函式名(實參1,實參2……);
1.形參
作用:形參是接受實參的
2.實參
3.形參和實參不匹配的問題
(1)如果實參個數多餘形參個數,則取到形參的個數就行了,後面的不管
(2)如果實參的個數小於形參的個數,結果為nan
三 函式的返回值
語法:return 需要返回的結果;
function getresult()
getresult();//getresult=666。但是沒有列印語句,所以不列印
console.log(getresult());//列印666
eg:return [num1+num2,num1-num2,num1/num2]
四 arguments
1.定義:arguments是當前函式的乙個內建物件。
所有的函式都內建了乙個arguments物件
arguments物件中儲存了傳遞的所有實參
2.使用
function fn()
fn(1,2,3);//會返回arguments陣列,其中的值為1,2,3
3.特點
(1)arguments是偽陣列
for(var i=0;i<=arguments.length;i++)
4.應用
(1)求陣列的中任意個數的最大值
function getmax()
}return max;
}console.log(getmax(1,2,3,4,5));
console.log(getmax(1,2,3,4,5,6,7));
(2)翻轉陣列
思路:把arr中最後乙個陣列取出來給新陣列的第乙個
function reverse(arr)
return newarr;
}console.log(reverse([1,2,3]));
五 函式相互呼叫
1.函式可以呼叫另外乙個函式
eg:function fn1()
fn1();
function fn2()
//111
222333
注:只呼叫了fn1所以只執行fn1。fn1中,先列印111,執行到fn2語句,就去找fn2函式去執行222。執完行fn2函式,再回到fn1的執行中執行333。fn1執行完了,就結束了。
(二)作用域
一 作用域
定義:指**名字(變數)在某個範圍內起作用和效果
作用:提高程式可靠性;減少命名衝突
二 全域性作用域與區域性作用域
es6之前,作用域分為:全域性作用域與區域性作用域
1.全域性作用域
指整個script標籤或者乙個單獨的js檔案
2.區域性作用域(函式作用域)
指函式內部,這個**的名字只在函式內部起作用
三 全域性變數和區域性變數
1.全域性變數
(1)指在全域性作用域下的變數
(2)定義:
function fun()
console.log(num2);//20
(3)在函式內部也可以使用全域性變數
(4)特點:
全域性變數只有瀏覽器關閉的時候才會銷毀,比較佔記憶體資源
2.區域性變數
(1)只能在函式內部使用,函式外部不能使用
(2)注意:函式的形參也可以當作區域性變數來看
(3)特點:程式執行完畢就會銷毀,比較節約記憶體資源
3.塊級作用域
現階段js沒有塊級作用域,因此塊級作用域裡面的變數,外面也可以使用
js在es6才新增了塊級作用域
塊級作用域:指用花括號包含的。比如if,for。
4.作用域鏈
定義:(就近原則)內部函式訪問外部函式的變數時,採取的是鏈式查詢(一層一層向上找)的方式來決定取哪個值。這種結構稱為作用域連。
eg:var num=10;
function fn()
}//函式返回的是20
(三)預解析
一 預解析
場景1:
console.log(num);
var num=10;
//會返回undefined。
場景2:
fn();
function fn()
//會返回11
function fn()
提到fn()前面。有了函式宣告再呼叫,因此不會報錯
場景2.1:
function fn()
fn();
//會返回11
場景3:
var fun=function()
fun();
//會返回11
場景3.1
fun();
var fun=function()
//會報錯
**相當於
var fun;
fun(); 此時就會報錯,因為這時候還沒有函式
fun=function()
1.預解析
js**由瀏覽器中的js直譯器執行。
js直譯器在執行js**時分兩步:預解析、**執行
預解析分為:變數預解析(變數提公升)、函式預解析(函式提公升)
(1)變數提公升:
把所有的變數宣告提公升到變數的當前的作用域內的最前面,但不提公升賦值操作
(2)函式提公升
把所有的函式宣告提公升到當前的作用域最前面,但不呼叫函式
2.例題
說出輸出結果
(1)分析順序:1)先var提公升全域性,2)然後函式提公升到前面。3)然後按照原順序把剩下的**寫在後面。4)然後函式內部的也要自己內部調整,內部也要變數提公升。
變成:var num;
function fun()
num=10;
fun();
輸出:undefined
(2)//undefined
20(3)
那麼此時b與c在函式內賦值了,但沒有var宣告。因此b與c當作全域性變數。
注:想一起宣告必須用逗號var a=9,b=9,c=9;
function f1()
f1();
console.log(c);
console.log(b);
console.log(a);//因為a是區域性變數,所以報錯a is not defined
//9 9 9 9 9 報錯
作用域 預解析
作用域概念預解析規則 作用域 在一定的空間 範圍 區域對內容進行讀寫!瀏覽器 js解析器 1 會去找 var function引數等,a 未定義 所有變數,在正式執行之前 都提前賦了乙個值 未定義 fn1 function fn1 所有的函式,在正式執行 之前,都是整個函式塊 這種叫做js 預解析 ...
js的預解析和作用域
預解析指的就是,在js檔案或者script裡面的 在正式開始執行之前,進行的一些解析工作。這個工作很簡單,就是在全域性中尋找var關鍵字宣告的變數和通過function關鍵字宣告的函式。1.尋找 var function 引數 等關鍵字,根據var a提前設定為 a 未定義 undefined 所有...
js中的作用域 預解析
任何地方都能訪問到的物件擁有全域性作用域。1.1函式外面定義的變數擁有全域性作用域 1.2未定義直接賦值的變數自動宣告為擁有全域性作用域 通俗地講,當宣告乙個函式時,區域性作用域一級一級向上包起來,就是作用域鏈。1.當執行函式時,總是先從函式內部找尋區域性變數 2.如果內部找不到 函式的區域性作用域...