下面我有 2 個例子,唯一的區別是一個函式有一個引數,而另一個沒有。但是示例 1 將登錄hello到控制臺,而示例 2 將登錄hello!到控制臺。
我的問題是為什么示例 1 記錄hello而示例 2 記錄hello!.
示例 1,我不確定發生了什么。我的猜測是在示例 1 中我們使用了變數陰影。該greet引數被初始化為原始字串hello。該greet引數隱藏greet來自第 1 行的內容。因此,當我們登錄greet到控制臺時,我們正在greet從全域范圍中記錄hello.
我并不肯定,但在示例 2 中,該函式salutation是使用引數 呼叫的'hello'。然后將全域變數greet重新分配給 的值'hello' '!'。因此,當greet登錄到控制臺時,我們正在記錄greet重新分配給的值hello!。
為什么函式中缺少greet引數允許我們將重新分配的值記錄到控制臺。但是當函式有引數時,我們將全域變數記錄到控制臺?
示例 1。
let greet = 'hello';
function salutation(greet) {
greet = greet '!';
}
salutation(greet);
console.log(greet); //hello
示例 2。
let greet = 'hello';
function salutation() {
greet = greet '!';
}
salutation(greet);
console.log(greet); //'hello!'
uj5u.com熱心網友回復:
為什么函式中缺少
greet引數允許我們將重新分配的值記錄到控制臺。但是當函式有引數時,我們將全域變數記錄到控制臺?
這兩個示例都將全域變數記錄到控制臺。
只是在第一個片段中,有一個區域greet變數被重新分配,而在第二個片段中沒有區域變數,它greet通過閉包分配(和訪問)全域變數。
uj5u.com熱心網友回復:
函式的引數是通過 value 復制的,所以greet(global) 和greet(local) 是完全不同的。下面一行greet是全域變數的副本,并且僅在函式內部可用,因此是區域的。
function salutation(greet) {
greet = greet '!';
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/344627.html
標籤:javascript 功能 范围 阴影
