Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

重复声明两个函数会怎样? #27

Open
iswuhuayu opened this issue Jan 10, 2017 · 4 comments
Open

重复声明两个函数会怎样? #27

iswuhuayu opened this issue Jan 10, 2017 · 4 comments

Comments

@iswuhuayu
Copy link

iswuhuayu commented Jan 10, 2017

<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的最终结果为:
@FrankFang FrankFang changed the title JS面试题求解 重复声明两个函数会怎样? Jan 11, 2017
@zhangolve
Copy link

重复生命两个函数跟重复生命两个变量本质上是一样的,都是以最后一次声明为准。

var a=5;
var a=6;
console.log(a); //  6

改改顺序方便理解:

<script> 
    var m= 1, j = k = 0; 
    function add(n) { 
        return n = n+1; 
  } 
  
    function add(n) { 
        return n = n + 3; 
    } 
  y = add(m);   //4
z = add(m);     //4
</script> 

@erasec1994
Copy link

erasec1994 commented Jan 13, 2017

将函数名当作 “变量名”。会好理解很多。如下:

其实 function add (){} 这样声明一个函数 类似 语法糖。

将 function add (){} 转化成 var add = function (){} //先声明,后使用。这样会好理解。

所以我认为 function add (){}是一种语法糖。

不过 function add (){} 和 var add = function (){} 是存在区别的,区别在于 函数声明提升 和 变量声明提

升。(使用代码来表达):

<script>
say()
function say(){
   console.log(0);
}
// 函数声明提升
这段代码中,无论执行语句在 function say (){}的前面还是后面,都能正常执行。
</script>
<script>
say2()
var say2 = function (){
   console.log(0);
}
// 变量声明提升
这段代码中,因为使用的是 变量的声明方式来声明一个函数,
在 JS 中 var 声明的变量只会在到该变量的赋值语句的时候才会生效,
所以执行语句必须放在 var say2 = function (){} 后面,否则会抛出一个错误。
</script>

也就是 当使用 函数声明 重复声明 两个函数的时候,因为函数声明提升,会先提取到程序开始的前面,当

重复声明的时候,会取最后声明的那个函数。所以当执行函数的时候,会使用后声明的那个函数而不是先

声明的函数。

//貌似说复杂了,还没说清楚的感觉。。。

@facejiong
Copy link

函数是对象,函数名相当于name属性,重复声明后者会覆盖前者

@C1erman
Copy link

C1erman commented Apr 14, 2019

在支持Function.name属性的浏览器中,name便代表着具名函数的函数名,可知就是function对象的一个属性,对象是引用传递,重复声明便会指向新的物理空间。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

6 participants