为了账号安全,请及时绑定邮箱和手机立即绑定

javascript面试题

javascript面试题

慕斯王 2019-03-14 18:15:19
function foo(a){    a = a * 10;}function bar(b){    b.value = 'new';}var a = 1;var b = {value: 'old'};foo(a);bar(b);console.log(a); //1console.log(b);function foo(){    a = a * 10;}function bar(b){    b.value = 'new';}var a = 1;var b = {value: 'old'};foo(a);bar(b);console.log(a); // 10console.log(b);为什么两道题的结果不一样
查看完整描述

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);


查看完整回答
反对 回复 2019-03-23
?
跃然一笑

TA贡献1826条经验 获得超6个赞

上面的方法设有形参变量,方法内部的代码执行操作的是这个形参。而下面的方法,没有设形参,也没有var一个a,所以在函数内部操作a的时候会从当前方法的上一作用域找这个a,然后就找window下的a了,之后的操作都是对全局下的a进行的操作,所以两次的结果不一样。


查看完整回答
反对 回复 2019-03-23
?
慕哥9229398

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忍者秘籍》


查看完整回答
反对 回复 2019-03-23
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

区别在于:foo 函数有没有定义行参。

foo 函数没有接收参数,操作的是全局变量a, 打印出来的也是全局变量a.
foo 函数接收参数,由于a 是基本数据类型,直接把本身传入函数,并且存在函数作用域,函数内部a,跟外面的全局变量a就没关系了,函数内部的a 属于函数上下文中的变量对象,外部的a 属于全局上下文中的变量对象。


查看完整回答
反对 回复 2019-03-23
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

这个坑其实不大的,第一个因为定义的是foo(a),所以运行中a=a*10的a是局部变量,因为这个值没有返回,所以全局的a并没有变。而第二个是foo(),直接操作的全局变量,注意这个时候的foo(a)其实等效于foo(),传参没有被接收的,还是直接全局变量。

查看完整回答
反对 回复 2019-03-23
  • 5 回答
  • 0 关注
  • 358 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信