搜尋

首頁  >  問答  >  主體

javascript - js的作用域問題?

var b = 10;
(function b(){
    b = 20;
    console.log(b);
})();

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

phpcn_u1582phpcn_u15822718 天前653

全部回覆(4)我來回復

  • 扔个三星炸死你

    扔个三星炸死你2017-06-26 10:52:34

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

    回覆
    0
  • 阿神

    阿神2017-06-26 10:52:34

    @輕鍵快碼 10 後面需要加分號

    這裡不存在函數提升,函數提升只存在於「函數宣告」的情況,而不存在於「函數表達式的」的情況。
    關於「函數宣告」和「函數表達式」的差別,網路上很多文章講的很清楚了,可以自己搜尋學習。

    回覆
    0
  • 欧阳克

    欧阳克2017-06-26 10:52:34

    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在自执行函数那里没有获取到返回值

    回覆
    0
  • 扔个三星炸死你

    扔个三星炸死你2017-06-26 10:52:34

    回覆
    0
  • 取消回覆