5 回答

TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超3個(gè)贊
因?yàn)榈谝欢未a相當(dāng)于:
function foo(c){
c = c * 10;
}
function bar(b){
b.value = 'new';
}
var a = 1;
var b = {value: 'old'};
foo(a);
bar(b);
console.log(a); //1
console.log(b);

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個(gè)贊

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個(gè)贊
首先a是一個(gè)基本數(shù)據(jù)類型的值,因此以參數(shù)的形式傳入a時(shí),就相當(dāng)于把a(bǔ)的值拷貝了一份,賦值給foo函數(shù)體內(nèi)的局部變量a,因此在函數(shù)體內(nèi)對(duì)局部變量的操作,不會(huì)影響到外部的全局變量a。
var a = 1;
var b = a; // 把a(bǔ)的值拷貝給b,就相當(dāng)于把a(bǔ)的值拷貝一份給函數(shù)參數(shù)中的a
b = 2; // 重新給b賦值,就相當(dāng)于在函數(shù)體內(nèi)重新對(duì)參數(shù)a賦值
console.log(a) // 1
這道面試題考查的是函數(shù)傳值和傳引用的區(qū)別,我之前也遇到過,在給你舉一個(gè)傳引用的例子吧
var number = new Number(2);
function test(number) {
number.value = 3; // 為number對(duì)象添加了value屬性
}
test(number)
console.log(number) Number {2, value: 3}
這里number是一個(gè)對(duì)象,屬于引用類型,因此以參數(shù)的形式傳入number時(shí),實(shí)際上傳入的只是number的地址,在函數(shù)體內(nèi)任何對(duì)number的操作都會(huì)反映到number對(duì)象上
最后給你一點(diǎn)小小的建議,一定要多看看書,很多東西只有看書才能理解透徹,推薦幾本我現(xiàn)在在看的書《javascript高級(jí)教程》《javascript語言精粹》《javascript忍者秘籍》

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超13個(gè)贊
區(qū)別在于:foo 函數(shù)有沒有定義行參。
foo 函數(shù)沒有接收參數(shù),操作的是全局變量a, 打印出來的也是全局變量a.
foo 函數(shù)接收參數(shù),由于a 是基本數(shù)據(jù)類型,直接把本身傳入函數(shù),并且存在函數(shù)作用域,函數(shù)內(nèi)部a,跟外面的全局變量a就沒關(guān)系了,函數(shù)內(nèi)部的a 屬于函數(shù)上下文中的變量對(duì)象,外部的a 屬于全局上下文中的變量對(duì)象。

TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個(gè)贊
這個(gè)坑其實(shí)不大的,第一個(gè)因?yàn)槎x的是foo(a),所以運(yùn)行中a=a*10的a是局部變量,因?yàn)檫@個(gè)值沒有返回,所以全局的a并沒有變。而第二個(gè)是foo(),直接操作的全局變量,注意這個(gè)時(shí)候的foo(a)其實(shí)等效于foo(),傳參沒有被接收的,還是直接全局變量。
添加回答
舉報(bào)