搜尋

首頁  >  問答  >  主體

JavaScript在全域物件中宣告變數,會成為一個全域物件的同名屬性而在函數中宣告變數則不會,為什麼?

JavaScript中,在全域宣告全域變數後,會成為全域物件的一個同名屬性。但在函數中宣告局部變數後,卻不會成為函數(物件)的屬性,而是要使用「函數名稱.屬性名稱」才能聲明,請問是什麼原因?

仅有的幸福仅有的幸福2748 天前941

全部回覆(7)我來回復

  • PHP中文网

    PHP中文网2017-06-26 11:00:35

    可以這樣理解:

    在函數內部宣告的變數屬於函數執行上下文對象,而不是函數對象
    全域環境下宣告的變數屬於全域執行上下文對象,這個上下文對象就是全域環境對象

    回覆
    0
  • 我想大声告诉你

    我想大声告诉你2017-06-26 11:00:35

    哪有什麼原因,規定就是這樣的。

    回覆
    0
  • 巴扎黑

    巴扎黑2017-06-26 11:00:35

    歷史遺留問題,建議使用嚴格模式消除迷惑。

    'use strict';
    
    var v = 2;
    console.log(window.v);   // undefined

    回覆
    0
  • 大家讲道理

    大家讲道理2017-06-26 11:00:35

    如果你是說這樣
    `function test(){

    var a = 1;     // 你说的a是test的属性。
        this.a = 1;// 这才是函数的属性,因为在JS里,“万物”皆对象(可能夸张了。)
                  //如果,还不明白,请自觉翻阅,“神奇的this”,"作用域"等基础JS章节

    }`
    //更新,錯誤改正。
    題主好好看基礎。

    回覆
    0
  • 我想大声告诉你

    我想大声告诉你2017-06-26 11:00:35

    我認為這就是函數變數的作用域問題,js是很靈活的,還望一起學習^~^ ^~^

    回覆
    0
  • 淡淡烟草味

    淡淡烟草味2017-06-26 11:00:35

    JavaScript中,在全域宣告全域變數後,會成為全域物件的一個同名屬性。在函數中宣告局部變數後,它變成局部對象,也就是函數的屬性,所以要先透過全域存取函數再存取函數中的局部變數。

    回覆
    0
  • typecho

    typecho2017-06-26 11:00:35

    函數作用域啊

    回覆
    0
  • 取消回覆