var b = 10; (function b(){ b = 20; console.log(b); })();
為什麼結果會輸出函數,還有想問下括號裡面的這個b函數有函數提升嗎
b
在函數表達式裡函數名是不可變的,只能引用,不能賦值。如果你加上 'use strict' 在 strict mode 下就可以觀察到報錯。
'use strict'
@輕鍵快碼 10 後面需要加分號
這裡不存在函數提升,函數提升只存在於「函數宣告」的情況,而不存在於「函數表達式的」的情況。 關於「函數宣告」和「函數表達式」的差別,網路上很多文章講的很清楚了,可以自己搜尋學習。
2樓說的意思是,在一個函數裡面修改它的函數名稱是不能實現的,比如說:
(function a(){ a = 10; //这个表达式不会成功,函数a依旧是函数a,至于这里面的a = 10等同于被废弃了,也不会生成相应的全局变量 })();
至於為什麼輸出的是函數a而不是20,簡單點就是那個語句直接被略過了,等同於
var b = 10; (function b(){ console.log(b); })();
補充:剛剛被人提醒了,自執行函數也是屬於函數表達式,開始寫答案的時候給了誤導很抱歉。
var b = 10; var b = (function(){ b = 10; console.log(b); //输出:10 })(); console.log(b); //输出:undefined 。 b在自执行函数那里没有获取到返回值
在函數表達式裡函數名是不可變的,只能引用,不能賦值。如果你加上
'use strict'
在 strict mode 下就可以觀察到報錯。@輕鍵快碼 10 後面需要加分號
這裡不存在函數提升,函數提升只存在於「函數宣告」的情況,而不存在於「函數表達式的」的情況。
關於「函數宣告」和「函數表達式」的差別,網路上很多文章講的很清楚了,可以自己搜尋學習。
2樓說的意思是,在一個函數裡面修改它的函數名稱是不能實現的,比如說:
至於為什麼輸出的是函數a而不是20,簡單點就是那個語句直接被略過了,等同於
補充:
剛剛被人提醒了,自執行函數也是屬於函數表達式,開始寫答案的時候給了誤導很抱歉。