5 回答
TA贡献1830条经验 获得超3个赞
因为第一段代码相当于:
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贡献1826条经验 获得超6个赞
TA贡献1877条经验 获得超6个赞
首先a是一个基本数据类型的值,因此以参数的形式传入a时,就相当于把a的值拷贝了一份,赋值给foo函数体内的局部变量a,因此在函数体内对局部变量的操作,不会影响到外部的全局变量a。
var a = 1;
var b = a; // 把a的值拷贝给b,就相当于把a的值拷贝一份给函数参数中的a
b = 2; // 重新给b赋值,就相当于在函数体内重新对参数a赋值
console.log(a) // 1
这道面试题考查的是函数传值和传引用的区别,我之前也遇到过,在给你举一个传引用的例子吧
var number = new Number(2);
function test(number) {
number.value = 3; // 为number对象添加了value属性
}
test(number)
console.log(number) Number {2, value: 3}
这里number是一个对象,属于引用类型,因此以参数的形式传入number时,实际上传入的只是number的地址,在函数体内任何对number的操作都会反映到number对象上
最后给你一点小小的建议,一定要多看看书,很多东西只有看书才能理解透彻,推荐几本我现在在看的书《javascript高级教程》《javascript语言精粹》《javascript忍者秘籍》
TA贡献1828条经验 获得超13个赞
区别在于:foo 函数有没有定义行参。
foo 函数没有接收参数,操作的是全局变量a, 打印出来的也是全局变量a.
foo 函数接收参数,由于a 是基本数据类型,直接把本身传入函数,并且存在函数作用域,函数内部a,跟外面的全局变量a就没关系了,函数内部的a 属于函数上下文中的变量对象,外部的a 属于全局上下文中的变量对象。
TA贡献1793条经验 获得超6个赞
这个坑其实不大的,第一个因为定义的是foo(a),所以运行中a=a*10的a是局部变量,因为这个值没有返回,所以全局的a并没有变。而第二个是foo(),直接操作的全局变量,注意这个时候的foo(a)其实等效于foo(),传参没有被接收的,还是直接全局变量。
添加回答
举报