用函式名定義的函式,會整體提公升到當前作用域的頂端,所以在函式定義前後都可以呼叫。
用函式表示式定義的函式,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 會報錯!函式宣告...