簡體   English   中英

函數表達式中的變量范圍

[英]Variable scope in function expressions

我最近一直在學習JavaScript的一些基礎知識,並花了很多時間來分解一些函數表達式以更好地理解它們。 我仍然不確定幾個示例中實際發生了什么,如果我錯了,我想對此進行一些解釋,或者至少確認我的思路是否正確。

共有三段代碼,它們之間略有不同:

var my_number = 7;

var timesTwo = function(number) {
    my_number = number * 2;
    console.log("inside " + my_number);
};

timesTwo(5);
console.log("outside " + my_number);

var my_number = 7;

var timesTwo = function(number) {
    var my_number = number * 2;
    console.log("inside " + my_number);
};

timesTwo(5);
console.log("outside " + my_number);

var my_number = 7;

var timesTwo = function(my_number) {
    my_number = my_number * 2;
    console.log("inside " + my_number);
};

timesTwo(5);
console.log("outside " + my_number);

我很好奇的是究竟發生了什么使他們像他們一樣工作。

第一種情況似乎是相對簡單的my_number從全局開始, number在函數本地,並且my_number在函數內部更改,因此在全局框架中為10。

第二種情況也很清楚-與第一種情況相似,只是在函數內部有一個新的局部變量my_number分配了10,而在函數my_number之外仍為7。

我不確定的是第三部分。 我假設既然所有提到的number現在my_number ,則該函數在以下行中創建一個新的my_number變量:

var timesTwo = function(my_number)

即使函數體中沒有var my_number

var my_number = 7;

var timesTwo = function(number) {
    my_number = number * 2;
    console.log("inside " + my_number);
};

timesTwo(5);
console.log("outside " + my_number);

第一個示例在全局范圍內聲明my_number並將其值設置為7 timesTwo是一個在其參數中接受自變量的函數,然后在該函數中將其引用為number 調用該函數時,您正在將全局范圍中定義的my_number變量設置為等於傳入的參數乘以2。 您正在使用“內部”和“外部”調用記錄相同的結果。

var my_number = 7;

var timesTwo = function(number) {
    var my_number = number * 2;
    console.log("inside " + my_number);
};

timesTwo(5);
console.log("outside " + my_number);

在第二個例子中,您聲明一個局部范圍my_number的內timesTwo功能。 因此,您在“內部”和“外部”調用中記錄了不同的my_number變量。

var my_number = 7;

var timesTwo = function(my_number) {
    my_number = my_number * 2;
    console.log("inside " + my_number);
};

timesTwo(5);
console.log("outside " + my_number);

在第三個示例中, timesTwo接受一個參數,並使用變量my_number進行跟蹤。

這稱為可變陰影

在函數定義中,指定my_number參數,該參數將新的局部變量引入函數范圍。

這將my_number外部的my_number以便在函數體內對my_number的任何引用都將引用傳入的參數,而不是外部的my_number變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM