js 函式 作用域 預解析

2022-09-10 13:03:25 字數 3446 閱讀 8597

(一)函式

定義:可以重複呼叫執行的**塊

一 函式的宣告和呼叫

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.如果內部找不到 函式的區域性作用域...