H5W3
当前位置:H5W3 > 其他技术问题 > 正文

【Web前端问题】javascript面试题

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); //1
console.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); // 10
console.log(b);

为什么两道题的结果不一样

回答:

因为第一段代码相当于:

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

回答:

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

回答:

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

回答:

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

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

回答:

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

回答:

此参数的a非彼定义的a

本文地址:H5W3 » 【Web前端问题】javascript面试题

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址