2016-08-06 106 views
1

我剛剛閱讀了關於'設置函數內部全局變量'的question的答案,但我仍然有疑問。函數參數作爲局部變量名稱的數字

這可能是非常基本的,但有人可以告訴我爲什麼當我這樣做時不會出現錯誤?我明白什麼是傳遞給函數的變量i的值的副本,但是......爲什麼

var i = 5; 

function exp(i) { 
    i = 7; 
    console.log(i); 
} 

exp(i); 
//logs 7 

function exp(i) { 
    return i = 7; 
    console.log(i); 
} 
exp(5) 
//logs 7 

和:

function exp() { 
    return 5 = 7; //or console.log(5 = 7); 
} 
exp()//Uncaught ReferenceError: Invalid left-hand side in assignment 

在第一個例子是我沒有使5 = 7?爲什麼函數記錄'7'?

這一切都來到了我已經看到了這個例子中的精彩JavaScript Garden局部變量之後:

// global scope 
var foo = 1; 
var bar = 2; 
var i = 2; 

function test(i) { 
    // local scope of the function test 
    i = 5; 

    var foo = 3; 
    bar = 4; 
} 
test(10); 

爲什麼測試(10),設置10 = 5裏面的功能不犯錯誤?

+0

你都賺不到5 = 7,你的設定值7〜variabile的我。如果你做「返回i == 7」,那麼它返回5 == 7,因此是錯誤的。 –

+0

但是,如果是這樣的話,我會將全局變量i改爲7,而事實並非如此。變量我仍然是5(在第一個例子中) – viery365

+0

可能重複[JavaScript是傳遞引​​用還是傳值語言?](http://stackoverflow.com/questions/518000/is- javascript-a-pass-by-reference-or-pass-by-value-language) – 4castle

回答

1

你的第一個方法

var i = 5; 

function exp(i) { 
    i = 7; 
    console.log(i);//of course it prints 7, i belong to exp scope 
} 
console.log(i)//it will print five 
exp(i); 

你沒有賦予i變量新的價值,只是爲了參數 得到了

function exp() { 
    return 5 = 7; //or console.log(5 = 7); 
} 

你試圖returnn 5 = 7;什麼是5? 在Javascript中,如果您不使用「嚴格模式」,那麼您可以聲明不帶var關鍵字的變量,但變量名不能以數字開頭。

function exp() { 
     return 5 + 7; //or console.log(5 + 7);//this will work 
} 
function exp(i) { 
     i = 5 
    return i = 7; //or console.log(5 + 7);//this will work 
} 
+0

我想我現在明白了:)謝謝:)所以,函數調用的參數總是給該函數的參數賦值,並且該參數必須是值,而不是變量名。這就是爲什麼在函數構造函數中,像函數X(name){this.name = name}一樣,參數'name'是指'name'值,而不是this.name。現在我想我終於明白了:) – viery365

2

你不能做5 = 7。5將永遠是5

I = 7等於我設置var當成7