javascript - js的作用域問題?
phpcn_u1582
phpcn_u1582 2017-06-26 10:50:34
0
4
646
var b = 10;
(function b(){
    b = 20;
    console.log(b);
})();

為什麼結果會輸出函數,還有想問下括號裡面的這個b函數有函數提升嗎

phpcn_u1582
phpcn_u1582

全部回覆(4)
扔个三星炸死你

在函數表達式裡函數名是不可變的,只能引用,不能賦值。如果你加上 'use strict' 在 strict mode 下就可以觀察到報錯。

阿神

@輕鍵快碼 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在自执行函数那里没有获取到返回值
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板