瀏覽器的預解析 宣告函式的兩種方式的區別

2021-10-01 19:44:16 字數 1802 閱讀 7025

首先來看三種執**況,猜想它的結果是什麼

第一種情況

var num =10;

fun();

function fun()

第二種情況

var num =10;

fun();

function fun()

第三種情況

console.

log(

fun())

;var fun = function (

)

情況一:undefined (為什麼請往下看)

情況二:20

情況三:uncaught typeerror: fun is not a function

這就與宣告函式的兩種方式以及瀏覽器的預解析有關。

js**是由瀏覽器的**解析器從上而下執行,而在這個之前有預解析的過程。

預解析會先找js**中的var、function和引數,找到之後提前至script標籤的最前面,結果如下:(以第一種情況為例)

var num;

function fun()

num =10;

fun(

);

預解析之後才是從上到下依次執行

這時,全域性解析完畢。

執行了下面的**

num =10;

fun(

);

當上述**執行到fun()之後,進入區域性作用域,再進行預解析,這時會找到fun()中的num,num並未賦值,所以第一種情況的結果是undefined,而不是10。

可以嘗試預解析下面的**:

var a =18;

f1();

function f1()

預解析過程:

//全域性: 

var a;

function f1()

a =18;

f1()// 區域性:f1()

var b;

var a;

b =9;

console.

log(a)

; console.

log(b)

; a =

'123'

// 結果為undefined 9

改變一下,如若是這種情況,結果又是什麼?

var a =18;

function f1()

f1();

結果是 18

解釋:這時在f1中,會在當前作用域下找變數a,如果當前作用域不存在變數a,會向上一級作用域找變數a,依此類推,直到找到為止。如果全域性變數域都沒有找到,會出現not defined (作用域鏈

回到問題,第三種情況,採用表示式宣告函式,在預解析的時候**順序發生變化,如下:

var fun;

console.

log(

fun())

;// 這個時候fun並未進行賦值,所以會報錯

fun = function (

)

宣告函式的兩種方式和區別:

function fun()

var fun1 = function (

)

瀏覽器的預解析過程

var foo function foo console.log foo 結果是函式體function foo 接著下面一道題 function foo var foo console.log foo 結果也是函式體function foo 所有就有很多人說,函式宣告的優先順序大於變數宣告的優先順序...

瀏覽器獲取cookie的兩種方式

將使用者資訊放入session中 session.setattribute user select user 將使用者資訊通過response寫入cookie cookie 路徑會預設使用mvc或者jsp所配置的專案路徑作為cookie的儲存資料夾 每次在修改瀏覽器的cookie之後,1 重新設定過...

簡單的兩種瀏覽器環境搭建。

在做到一些需要獲取資料,或者用到json專案中,瀏覽器會出現跨域問題。這裡需要搭建簡單的瀏覽器環境或者更改chrome本地配置。如圖,直接執行專案情況。解決方案有兩種。一是更改chrome配置,點選chrome圖示,右鍵 屬性 快捷方式 選項卡裡選擇 目標 新增 args disable web s...