-
牛魔王的故事
因为第一段代码相当于: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); //1console.log(b);
-
跃然一笑
上面的方法设有形参变量,方法内部的代码执行操作的是这个形参。而下面的方法,没有设形参,也没有var一个a,所以在函数内部操作a的时候会从当前方法的上一作用域找这个a,然后就找window下的a了,之后的操作都是对全局下的a进行的操作,所以两次的结果不一样。
-
慕哥9229398
首先a是一个基本数据类型的值,因此以参数的形式传入a时,就相当于把a的值拷贝了一份,赋值给foo函数体内的局部变量a,因此在函数体内对局部变量的操作,不会影响到外部的全局变量a。var a = 1;var b = a; // 把a的值拷贝给b,就相当于把a的值拷贝一份给函数参数中的ab = 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忍者秘籍》
-
慕田峪7331174
区别在于:foo 函数有没有定义行参。foo 函数没有接收参数,操作的是全局变量a, 打印出来的也是全局变量a.foo 函数接收参数,由于a 是基本数据类型,直接把本身传入函数,并且存在函数作用域,函数内部a,跟外面的全局变量a就没关系了,函数内部的a 属于函数上下文中的变量对象,外部的a 属于全局上下文中的变量对象。
-
摇曳的蔷薇
这个坑其实不大的,第一个因为定义的是foo(a),所以运行中a=a*10的a是局部变量,因为这个值没有返回,所以全局的a并没有变。而第二个是foo(),直接操作的全局变量,注意这个时候的foo(a)其实等效于foo(),传参没有被接收的,还是直接全局变量。