首页 > 试题广场 >

请给出下面这段代码的运行结果( )

[单选题]
请给出下面这段代码的运行结果( )
<SCRIPT LANGUAGE="JavaScript">
var bb = 1;
function aa(bb) {
    bb = 2;
    alert(bb);
};
aa(bb);
alert(bb);
</SCRIPT>



  • 1 1
  • 1 2
  • 2 1
  • 2 2
推荐
C
这道题考察是局部变量和参数传递的问题。
function aa(bb) {     bb = 2;     alert(bb); };
在aa函数中,bb是以传值的方式传入的,在函数中,会重新定义一个bb变量,并将其值覆为2,并不影响函数体外的bb变量,所以其值仍然为1.

编辑于 2014-12-30 21:05:50 回复(19)
函数体内,bb并没有使用var来定义,按理说这个bb在预处理的时候应该是window的属性。但在这里,函数声明的时候,带了一个参数bb,也就是相当于在函数体内声明了var bb。所以,函数里的bb就是函数活动对象的属性。所以函数执行时会输出2。函数执行完后,函数的活动对象被销毁,也就是局部的这个bb被删除了,执行流进入到window,再输出bb,值就是1了。
编辑于 2017-03-08 13:54:26 回复(20)
咱们直接来看调用执行代码  第一个不用说了  肯定是2   第二个 释义  函数里不声明var 他其实是改变的函数行参

发表于 2019-02-21 13:30:21 回复(0)
都选C,我看过,大鹏的
发表于 2018-06-11 21:57:21 回复(0)
第一个要进入函数,第二个不用进去
发表于 2017-08-10 12:23:13 回复(0)
关键是看到函数声明带了个参数。
发表于 2016-10-27 18:50:55 回复(0)
如果要访问函数aa内的变量,就要用闭包了
发表于 2016-04-03 17:10:10 回复(0)
基本类型是不能改变其值得,这里还考察了块级作用域的概念
发表于 2015-10-31 11:31:22 回复(1)
记住一句话就好了:“ECMA中所有函数的参数都是按值传递的”。
值传递:把把一个值类型(也叫基本类型)传递给另一个变量时,其实是分配了一块新的存储空间,因此就本题来说,在内部改变这个值时,其实在函数外部对这个值没有影响。
发表于 2016-01-04 22:42:52 回复(9)
答案选C。本题的切入点不是参数的传递方式,而是作用域。在本题中,aa函数有个叫bb的参数,所以aa的作用域里有bb这个属性。因此bb=2是给aa里的bb赋值,不会影响到外层的bb。因此,第二个alter的输出结果是1而不是2。但如果把参数名改了,比如cc,则两次的输出都是2。在Chrome上测试过了。
发表于 2017-03-05 14:53:04 回复(3)
囧了╮(╯_╰)╭我做的时候还特别确定选D
发表于 2015-05-20 23:49:15 回复(1)
个人理解,这道题考的是js函数的传参方式。js中传参方式分为按值传递和按共享传递。
在JavaScript中,基本数据类型按值传递,比如:
var a=100;
 function foo(x){
     x=1;
 }
 foo(a);
 console.log(a)
最后输出的结果为100,变量a并没有被修改为1 
而JavaScript中对象的传递与基本类型不同,它是按共享传递的。我对按共享传递的理解是——按共享传递时,我们应该把形参看做由两部分组成,一部分是形参本身、一部分是形参属性所指向的地址。形参本身是按值传递的,但形参属性所指向的地址却和实参属性地址一样,可以看作按引用传递。比如
var a={
    x:1,
    y:2
}
function foo(obj){
    obj={
        x:3,
        y:4
    }
}
foo(a)
console.log(a)
最后输出的结果a仍然是{x:1,y:2}。这是因为形参本身是按值传递的,修改形参本身不会造成实参的修改,如果把上面的代码改成如下这样子
var a={
    x:1,
    y:2
}
function foo(obj){
    obj.x=3;
    obj.y=4;
}
foo(a)
console.log(a)
最后就会很神奇的发现a被修改为了{x:3,y:4},这是因为形参属性所指向的地址与实参所指向的地址一样,修改的形参的属性就同时修改了实参的属性。 
发表于 2017-11-05 21:37:20 回复(2)
考察JS变量的作用域问题。这里是因为函数的参数名与全局变量相同,在函数内调用改变量名是对函数参数的调用,而不是对全局变量的调用。可见博客   http://blog.csdn.net/Yy921117/article/details/51823714
发表于 2016-08-26 21:31:15 回复(0)
C  
   ECMAScript中所有函数的参数都是按值传递的。也就是说,把函数外部的值复制给函数内部的参数,就和把一个值从一个变量复制到另外一个变量一样。基本类型的传递如同基本类型变量的复制一样,而引用类型值的传递,则如同引用类型变量的复制一样。
    在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(即命名参数,或者用ECMAScript的概念来说,就是arguments对象中的一个元素)。在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。


发表于 2015-02-03 18:22:13 回复(3)
如果方法没有参数,就应该选d了吧
发表于 2017-11-28 20:48:46 回复(0)
<SCRIPT LANGUAGE="JavaScript">
var bb = 1;
function aa(bb) {
    var bb;   //注意这里,参数实际上就是在方法体中隐式的定义了一个与形参一致的变量
    bb = 2;
    alert(bb);
};
aa(bb);   // aa(1);  但是在方法体里面对bb进行了重新赋值 bb = 2,所以结果是alert(2)
alert(bb);  // 这里的bb是全局变量,aa方法体里面的bb = 2并不会影响到全局变量bb,所以结果为alert(1)
</SCRIPT>
实际的代码是这个样子的,这就容易理解了
编辑于 2021-03-04 19:29:04 回复(1)
1、aa(bb),执行函数aa并将bb的值1,传入aa函数的形参bb中 bb = 1,但函数中的bb = 2,将之前的 bb = 1重新赋值覆盖了,因此函数中的console.log(bb) 输出 2。
2、因为函数的形参处有bb,所以函数中的 bb = 2 为函数中的局部变量,故全局作用域下的 bb = 1,故 console.log(bb) 输出 1.
编辑于 2021-05-07 12:55:12 回复(0)
所有的函数的参数都是按值传递,函数内部的bb与外部的bb是相互独立的,互不干扰。
如果将程序改为:
var bb =1;
function aa() {
   bb =2;
   alert(bb);
};
aa();
alert(bb);
此时结果为2,2
因为此时等于是在函数内部重新将bb申明了一遍,并且是以全局变量的形式申明的,所以是2,2

发表于 2016-09-06 16:37:14 回复(0)
<script>
var bb = 1;
function aa() {
    bb = 2;
    alert(bb);
};
aa();
alert(bb);
 
如果代码是这样的  结果就是2 2 
发表于 2016-08-23 10:26:49 回复(0)
因为当方法传入一个参数时,函数会在函数体内形成一个私有的变量bb,而函数体内已经有了一个bb=2,这时候当alert(bb)时,bb=2并没有接收传入的bb值,而是把私有的bb给覆盖掉了,因为它是全局的。
以上这种情况说明了一个问题,就是要使用函数的形参形成的私有变量,必须要把这个变量赋值给另外一个变量才可以使用,也就是获得到形参的值。
发表于 2016-02-25 14:14:21 回复(0)

var bb = 1;
function aa() { //函数没有传参数,
bb = 2; //函数没有传参数,并且在函数内bb未声明并赋值,此处bb为全局变量
};
aa();
console.log(bb);//输出2

var bb = 1;
function aa(bb) { //函数有传参数
bb = 2; //函数有传参数,并且在函数内bb未声明并赋值(相当于给形参bb赋值),此处bb为局部变量
};
aa(bb);
console.log(bb);//输出1

发表于 2022-01-02 17:19:18 回复(0)