關於函數表達式的標識符/函數名


函數的標識符也就是通常說的函數名,在函數聲明中不可省略,而函數表達式中可以省略。

我們都知道,javascript引擎將函數名視同變量名,所以采用function命令聲明函數時,整個函數會像變量提升一樣被提升到代碼頭部。所以函數聲明先執行也不會報錯,而函數表達式則會。

對於下面的代碼

 foo(); bar(); var foo=function bar(){ console.log(1); }

我們根據變量提升和函數提升的理論可以肯定是會報錯的,實際運行下

foo(); //Uncaught TypeError: foo is not a function

bar(); //Uncaught ReferenceError: bar is not defined

一開始我的理解是,變量foo被提升后,等同於

var foo //undefined
foo=function bar(){ console.log(1); }

瀏覽器還不知道bar是什么,報錯 ReferenceError: defined 很正常。那么下面這樣呢:

var foo=function bar(){ console.log(1); } bar();

或者

new function bar(){//作為New表達式(NewExpression)的一部分,它也是函數表達式 console.log(1); } bar();

運行結果依舊是bar(); //Uncaught ReferenceError: bar is not defined。這和想象中不符啊,沒有先執行,為什么bar依舊是defined?既然函數標識符被視同變量名,那么對於函數表達式的標識符,怎么會找不到,所以它的作用域在哪里?

所以有了下面的代碼:

var foo = function bar(){ console.log(bar); } foo();

打印結果如下:

ƒ bar(){
console.log(bar);
}

果然思路沒錯,函數表達式的標識符的作用域就在它自己的函數體。函數名是不能調用函數表達式的,如果要調用,也只有遞歸的情況了。

除此之外,通過搜索引擎找到關於函數表達式的標識符這樣的卵用,例子如下:

var f1 = function b1(){ return f2(); } var f2 = function b2(){ return f3(); } var f3 = function b3(){ debugger; } f1();

當每個函數都給上標識符,那么調用棧就會顯示被調用的函數的名字

是不是看起來就比較明朗√

关注微信公众号

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com