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

我发现一个蛋疼的问题,sum难道是javascript的关键字不成?

我发现一个蛋疼的问题,sum难道是javascript的关键字不成?

我吃炸土豆 2016-02-22 11:28:32
今天写三个数求和的时候,发现函数名字是sum的时候,那个函数只能调用一次,两次以上就有问题;而改函数名字之后,就对了!!醉了醉了。问题代码如下<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gbk" /> <title>函数传参</title> <script type="text/JavaScript">    function sum(x, y, z)                 {   sum = x + y +z;   document.write(x+"、"+y+"、"+z+"和:"+sum+"<br/>"); }     sum(5,8,3);     //下面一行会报错     sum(7,1,4); </script> </head> <body> </body> </html>难道是因为函数名字与变量名字不能相同?但应该是可以的吧
查看完整描述

4 回答

已采纳
?
Caballarii

TA贡献1123条经验 获得超629个赞

js中函数也是变量,sum原来是个函数,但执行一次以后,sum被赋值x+y+z,变成了一个数值型变量,所以再把它当函数用就报错了。

查看完整回答
1 反对 回复 2016-02-22
  • 我吃炸土豆
    我吃炸土豆
    我试了,确实改了里面的变量名就行了。但是不太科学啊,不区分函数和变量,难道调用函数的时候可以不加括号哈
  • Caballarii
    Caballarii
    函数名不加括号就只是一个变量,可以赋值,比如function sum(){}, 你可以用var sum1=sum;这样就可以用sum1()来调用函数
  • 我吃炸土豆
    我吃炸土豆
    ...这也太随意了,可以赋值,又不能调用。因为可以像sum;调用的时候,又和变量定义混淆了
点击展开后面2
?
ruibin

TA贡献358条经验 获得超213个赞

你最主要问题是没有搞清楚什么是局部变量,什么是全局变量。什么时候创建的变量是局部变量,什么时候创建的是全局变量。这个问题的核心是:在函数内部如果我们穿件变量时不使用var,并且这个变量不是参数,那么这个创建的变量会成为全局变量。而这个函数其实就相当于var sum = function(){};你在内部创建一个全局变量,就相当于把这里的var sum 赋值为

x + y +z了。所以这并不是随意不随意的问题。

查看完整回答
1 反对 回复 2016-02-22
  • ruibin
    ruibin
    这里并不是指针,js中没有就不存在指针这个概念。在java中你可以不声明就使用变量?这里却可以,但是不声明的结果就是全局变量。
  • ruibin
    ruibin
    不加var会引起很多问题,特别是框架里面,很多会直接报错。严格模式也是不允许的,在非严格模式下,使用(注意这里是使用)为声明的变量会报Reference Error
  • 我吃炸土豆
    我吃炸土豆
    谁知道他内部有没有用指针?java还自称没有指针呢,我也不是说我用java/c的思想来看待js就有多正确。只是以前没有接触过这种弱类型的语言,难免思维迁移,理解出错嘛
点击展开后面4
?
merry_离

TA贡献2条经验 获得超0个赞

确切的说是同一作用域函数名和变量名不能相同的,你这么写,sum函数的执行过程中,把sum重新指向 

x + y +z;
原来的sum这个时候已经变成了x+y+z;
function sum(x, y, z) {
   	var sum = x + y +z;
  document.write(x+"、"+y+"、"+z+"和:"+sum+"<br/>");
}
    sum(5,8,3);
    sum(7,1,4);

如果在function sum() 里面再申明一个sum 并且没有变量提升,就可以避免冲突。

查看完整回答
反对 回复 2016-02-24
  • 我吃炸土豆
    我吃炸土豆
    问题的关键是,为什么变量名和函数名会冲突
  • ruibin
    ruibin
    js是弱类型语言!函数名也可以说是变量名。function sum() {}和 var sum = function() {}如果不考虑声明提前那么他们两个是完全一样的,所以现在有些js书写规范建议只写成var sum = function() {}这种形式,而不写成function sum() {}这种形式,就是为了方便其他语言转来学习js的程序员。
  • 4 回答
  • 0 关注
  • 2174 浏览
慕课专栏
更多

添加回答

举报

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