js中關於作用域 函式宣告的提公升 的解析

2021-09-26 01:43:46 字數 1144 閱讀 7152

用函式名定義的函式,會整體提公升到當前作用域的頂端,所以在函式定義前後都可以呼叫。

用函式表示式定義的函式,var fn;會提公升,函式體不會提公升,所以在函式之前呼叫fn();會報錯。

fn();//我是fn

function fn()

fn();//我是fn

fn();//報錯,因為fn的函式體並沒有被提公升,此時只是var fn;被提公升了

console.log(fn); //undefined

var fn = function()

fn();//我是fn

var a = 5;

a = function()

a();//哈哈

解析:首先給a賦值為5,然後給a賦了乙個函式,呼叫這個函式,結果是哈哈。

var a = 5;

function a()

console.log(a);//5

a(); //報錯 a is not a function

解析:var a;      function a()       都提公升到了當前作用域的頂端,也就是說剛開始a是宣告了未賦值,接著給a賦了乙個函式,然後接著看沒有被提公升的**,a=5;   5覆蓋掉了函式,此時a=5;所以列印出來的是5,去呼叫a();就是呼叫5();所以報錯。

var a = 5;

a = function()

a();

解析:首先給a宣告賦值為5,然後函式覆蓋掉了5,呼叫a();裡面列印a,就是列印a自己的函式體。

var fn1 = function()

fn1();//可以執行

fn1();//fn1 is not a function

解析:第乙個fn1();呼叫的時候首先給fn1賦值為乙個函式,接著fn1 = 5;由於函式內部沒有定義fn1,所以是函式外部的,就是5把函式覆蓋掉了,此時fn1 = 5;這樣第乙個fn1();就執行結束了;第二個fn1();就相當於5();所以報錯。

var fn1 = function()

fn1();//可以執行

fn1();//可以執行

解析:第乙個fn1();呼叫的時候首先給fn1賦值為乙個函式,接著在函式內部給fn1賦值為5,這樣第乙個fn1();就執行結束了,此時fn1還是個函式;第二個fn1();依然是執行這個函式。

關於js作用域變數和函式宣告提公升的總結

var a 1 function a console.log a 1 a 報錯var a function a console.log a 列印函式體 a 2一 預解析時,函式宣告建立的函式整體會提公升到所在執行環境 作用域 的頂部,函式表示式建立的函式,僅僅提公升變數名到所在執行環境 作用域 的頂...

JS變數提公升,函式宣告提公升及變數作用域的理解

在一般情況下,js 都是自上而下執行的,對於同乙個變數,可以通過如下方式來修改 var a 1 a 2 console.log a 2 a function console.log a function console.log a var a 1 console.log b var b functi...

總結函式宣告提公升,閉包,作用域,this

js作用域鏈 var n 120 function a a 100 function b b 120 function c 100,注意 不加var是乙個全域性變數 function a console n 在函式外部找函式內部變數,找不到 function a console n 會報錯!函式宣告...