首页 > 试题广场 >

运行以下程序

[单选题]
运行以下程序
<script> 
    var m= 1, j = k = 0; 
    function add(n) { 
        return n = n+1; 
  } 
    y = add(m); 
    function add(n) { 
        return n = n + 3; 
    } 
z = add(m); 
</script> 
y和z的最终结果为:
  • 2,4
  • 4,4
  • 2,2
  • 报异常
推荐
js里面没有函数重载的概念,在其他语言中(如java)java中,可以存在同名函数,
只要传入的参数数量或者类型不同即可。在js中,定义了两个同名函数后,
后面的函数会覆盖前面定义的函数。结合这道题来说,由于函数声明提升,
所以函数声明会提前,由于存在同名函数,后面的add函数将覆盖第一个add函数,
所以两次调用add()返回的值是相同的。也就是y,z都为4.

编辑于 2016-11-01 14:10:41 回复(20)
function add(){}定义的函数会优先解析,而不是顺序解析;因此整个过程中,首先依次解析两个add function,由于同名,所以后者会覆盖前者;然后,顺序解析其余的JS代码,y = add(m);语句和z = add(m); 语句调用的都是第二个add function,因此返回的都是4.
定义函数的三种方式有:function函数、Function()构造函数、对象字面量。
从解析顺序来分析,它们的不同在于:function函数:优先解析;Function()构造函数、函数字面量定义:顺序解析。
                    示例:
                        // 4 2 3 3 5 6
                        function f(){return 1;}                 // 函数1     优先解析
                        alert(f());        //返回值为4 说明第1个函数被第4个函数覆盖   
                        var f = new Function("return 2;");        // 函数2
                        alert(f());        //返回值为2 说明第4个函数被第2个函数覆盖
                        var f = function(){return 3;}            // 函数3
                        alert(f());           //返回值为3 说明第2个函数被第3个函数覆盖   
                        function f(){return 4;}                 // 函数4    优先解析 覆盖函数1
                        alert(f());        //返回值为3 说明第4个函数被第3个函数覆盖
                        var f = new Function("return 5");         // 函数5
                        alert(f());    //返回值为5 说明第3个函数被第5个函数覆盖   
                        var f = function(){return 6 ;}            // 函数6
                        alert(f());        //返回值为6 说明第5个函数被第6个函数覆盖   



发表于 2016-08-06 15:52:07 回复(14)
Js中函数没有重载的概念,所以同名函数,最后一个会覆盖前一个,只执行后一个函数
发表于 2016-04-29 12:20:14 回复(0)
B
  1. 在Function类型里,函数是对象,函数名是指向函数对象的指针, 没有重载
  2. 当声明了多个同名函数时, 后面的函数会覆盖前面的函数 ,所以在题目中,事实上只有后面的add(n)起了作用,因此,两个结果都为4。
  3. 补充一点:个人感觉这里有一点 函数声明和函数表达式 的区别需要特别注意!解析器在向执行环境中加载数据时,会率先读取函数声明,并使其在执行任何代码之前可用。也就是先读取function函数的声明,再读取函数表达式y = add(m);语句 和 z = add(m);语句, 所以 y = add(m);语句虽然在函数声明之前,但依然应用了函数。
发表于 2016-08-24 21:01:59 回复(9)

考察两个知识点:1.函数声明提升,浏览器解析的时候会首先对声明函数优先解析,记住是声明函数,而不是匿名函数!因此调用函数的位置可以放在前面! 2.考察函数没有重载的问题。简单的说没有重载就是每个函数的函数名只是指向函数的指针,因此再次命名相同函数名的函数时,就相当于改变了指针内的内容。看起来就像是第二个把第一个覆盖了。 个人理解,参考

发表于 2017-02-28 17:20:29 回复(1)
javascript函数可以在任何位置被调用,后面的函数会覆盖掉前面出现的函数,因此y和z调用的都是后面那个add(),输出4,4
发表于 2016-06-22 20:13:17 回复(2)
同名函数,后面覆盖前面
发表于 2016-06-17 20:43:32 回复(0)
js中在作用域中有一个Hoisting的概念,包含两个内容:变量提升和函数提升
1.变量提升:在同一作用域中,变量声明会被提前,但赋值不会
e.g.
var i = 1;
function(){
    console.log(i);//输出undefined
    var i = 2;
}
2.函数提升:在同一作用域中,函数声明会整个提前到前面(而函数表达式不会)
e.g.
var m= 1;
y = add(m); //y=4
function add(n) { 
     returnn = n + 3; 
编辑于 2017-07-20 20:57:19 回复(0)
代码中出现了两次函数声明,在javascript中,函数声明会被提升到代码顶部
所以以最后一次函数声明为准
然后在调用函数
y = add(m); // 1 + 3
z = add(m); // 1+ 3
发表于 2016-07-24 09:17:37 回复(1)
变量和告诉申明提升
发表于 2016-05-07 00:23:11 回复(1)
js里面没有函数重载的概念,在其他语言中(如java)java中,可以存在同名函数,
只要传入的参数数量或者类型不同即可。在js中,定义了两个同名函数后,
后面的函数会覆盖前面定义的函数。结合这道题来说,由于函数声明提升,
所以函数声明会提前,由于存在同名函数,后面的add函数将覆盖第一个add函数,
所以两次调用add()返回的值是相同的。也就是y,z都为4.
发表于 2022-03-19 15:56:06 回复(0)
函数声明提升,第一次提升的a函数被第二次提升的函数a覆盖
发表于 2022-03-10 20:11:14 回复(0)
两个add,第二个覆盖了第一个,再赋值时只用第二个add
发表于 2021-12-11 22:59:38 回复(0)
js中,若定义有同名函数,那么后面的函数会覆盖前面的函数
发表于 2019-02-21 15:54:19 回复(0)
js里没有函数重载,如果存在两个同名函数,后一个函数会覆盖前一个函数;解析器在读取、加载数据时会先读取函数声明再读取函数表达式。综上,y和z的值都为4.
发表于 2017-12-10 20:21:16 回复(0)
谁会写这么**的代码?
发表于 2017-10-05 15:04:03 回复(0)
由于变量声明(function f(){...} 或者 var a=undefined)会被js引擎优先解析,也就是hoisting,所以这里俩个函数声明都会提升。
在对第二个add函数名初始化时改变了第一次add函数名的引用。也就是后面的函数名引用覆盖了前面的引用。
所以这里的输出结果是 4,4。
编辑于 2017-07-28 11:44:14 回复(0)
对着那个n想了n久,才想起n不过是形参而已……
发表于 2017-06-01 17:43:34 回复(0)
看了那么多答案,我就想问一下,为什么不报错。。。
发表于 2017-03-23 23:31:49 回复(0)
javascript在预解释时后面add方***覆盖前面的add方法,所以两个结果是一样的,参数为1,所以结果为4,4
发表于 2016-06-10 11:21:18 回复(0)
结果为4,4 后面的函数覆盖了前面的
发表于 2016-05-05 20:07:08 回复(0)