我的习惯是
function funcA(str){  }
但是我在网上见过有人写成:  
function funcA(var str) {}
我是一个菜鸟,想问一下这两种形参的声明方法有什么不同

解决方案 »

  1.   

    你的第二种写法好像是不对的,形参不用加var的,网上很多人说,javascript声明一个变量,有没有var都一样,其实不对的,没有加var话,其实就是声明了一个变量,只是给window对象加了一个属性而已,只有加了var才是声明一个变量,你可以复制下面的代码运行一下。<script type="text/javascript">
    attribute=10; //给window对象添加一个属性attribute
    alert(attribute); //弹出属性的值
    var flag = delete window.attribute; //删除window的attribute属性
    alert(flag); //弹出true,证明属性删除成功了
    //alert(attribute);  //这里会报错,因为window的attribute属性已经被删除了
    var variable=10; //声明一个变量
    alert(variable); //弹出变量variable的值
    flag = delete window.variable; //删除window的属性
    alert(flag); //弹出false,删除window属性失败,因为variable是一个变量,不是window的属性
    alert(variable); //弹出变量variable的值
    </script>
      

  2.   

    你的第二种写法好像是不对的,形参不用加var的,网上很多人说,javascript声明一个变量,有没有var都一样,其实不对的,没有加var话,其实不是声明了一个变量,只是给window对象加了一个属性而已,只有加了var才是声明一个变量,你可以复制下面的代码运行一下。
    JScript code
    <script type="text/javascript">
    attribute=10;                        //给window对象添加一个属性attribute
    alert(attribute);                    //弹出属性的值
    var flag = delete window.attribute;    //删除window的attribute属性
    alert(flag);                        //弹出true,证明属性删除成功了
    //alert(attribute);                 //这里会报错,因为window的attribute属性已经被删除了
    var variable=10;                    //声明一个变量
    alert(variable);                    //弹出变量variable的值
    flag = delete window.variable;        //删除window的属性
    alert(flag);                        //弹出false,删除window属性失败,因为variable是一个变量,不是window的属性
    alert(variable);                    //弹出变量variable的值
    </script>
    上面打错一个字,意思反了,现在重新回复一下
      

  3.   

    请问:bbjbepzz,
    下面我还有一个问题不明白:
     var dog = function (name)
     { 
          this.Name = name;
     };
    与下面的有什么不同,请指教。
     var dog = function (name)
     { 
          var Name = name;
     };
      

  4.   

    用var 声明的是局部的 没有的是全局的
      

  5.   


    报错了,在firebug里面调试就知道.
    考虑浏览器支持情况,肯定是第一种方法正确的.
      

  6.   


    <script>
        var dog = function (name) {
            //this表示调用该构造函数的对象实体。
            this.Name = name;
        };
        //当执行这句话的时候,上面的this就是d,从而d对象有了Name属性,并且值为aaa
        var d = new dog("aaa");
        //aaa
        alert(d.Name);    var dog = function (name) {
            var Name = name;
        };    //这时候d只是dog构造函数的一个实体,它并没有Name属性。因为在构造函数中,没有通过this来指向他,给他附加属性。
        var d = new dog("aaa");
        //undefined
        alert(d.Name);
    </script>
      

  7.   

    用var声明的是变量,在类内部使用的(其实也可以说是一个函数,主要看你怎么用了)。用了this的,后面跟的就是对象(也可以说是实例)的成员(成员包括成员属性和成员方法)。好像我说的不太明白,你new 一个对象出来你就知道了。。
      

  8.   

    谢谢 #9,#10 的帮助!!!我还一点不明白!
     你们是如何看待下面的代码,哪种写的比较规范?
    {
     var dog = function (name) {
    this.Name = name;
    this.AlertName=function(){alert(this.Name)};
    };
    var d = new dog("aaa");
    d.AlertName();
    }
    {
    var dog = function (name) {
    var Name = name;
    this.AlertName=function(){alert(Name)};
    };
    var d = new dog("aaa");
    d.AlertName();
    }
    它们都是Alert("aaa");
      

  9.   

    都规范啊,这个主要看你自己的需要了,第一个写法你可以理解为java的,public String Name,你可以get,set它的值;第二种private String Name;一个是对象的实例可以访问到的,一个是只在类内部的成员才能访问到的,对象实例访问不到。你可以这么理解。你也可以这么理解第二写法,对象属性私有化,公开一个方法来获取这个属性的值。不知道说错没有,高手如果看到我说错了,不要骂我啊。
      

  10.   

     非常感谢:bbjbepzz 的耐心作答!
    再次请问:
     您是如何看代下面的两种问题的区别的?//问题一
    {
     var dog = function (name) {
    this.Name = name;
    this.AlertName=function(){setTimeout(function(){alert(this.Name)},2000);};
    };
    var d = new dog("aaa1");
    d.AlertName();
    }
    //问题二
    {
    var dog = function (name) {
    var Name = name;
    this.AlertName=function(){setTimeout(function(){alert(Name)},2000);};
    };
    var d = new dog("aaa2");
    d.AlertName();
    }
    //问题一 :输出 undefined
    //问题二 :输出 aaa2
      

  11.   

    这个问题主要是出在你对this的理解上,你要知道问题一中的this指向什么,其实问题一里面的this指向是的window对象,不是d(你创建的那个实例),window对象没有这个Name属性,所以是undefined,你把代码改成下面这样就可以了。
    var dog = function (name) {
            this.Name = name;
            this.AlertName=function(){var obj=this; setTimeout(function(){ alert(obj.Name)},2000);};
        };
        var d = new dog("aaa1");
        d.AlertName();问题二的答案是aaa2就不一用解释了,因为这个变量的作用域是dog这个类,所以在这个类里面,都可以访问到Name变量。
      

  12.   

    我的理解是setTimeout()里面执行的匿名函数,是在window作用域下!
    所以this 是指向window!所以第一个会undefined!
    ,你写匿名函数在setTimeout里面 ,根本不会重复调用!
    这写法真疼!
      

  13.   

    这个是习惯问题,不过习惯有时候可以酿成大错的。没有写var 是局部变量。写了var 是全局变量。
      

  14.   

    你说错了,没有写var的不是变量,只是window对象的一个属性,只有加了var声明的那才是一个变量。
      

  15.   

    总结一下:
    bbjbepzz 已经把问题说得行清楚了!
      name="小黄";
    上下等价
      window.name="小黄";
    //
    //下面是声明一个func 
    function abc(){
    ...
    };
    上下等价
    window abc = function (){
    ...
    };
    上下等价
    this.abc = function (){
    ...
    };这些,都是 bbjbepzz  的功劳!
      

  16.   

    总结一下:
    其实 bbjbepzz 已经把问题说得行清楚了!
      name="小黄";
    上下等价
      window.name="小黄";
    //
    //下面是声明一个func 
    function abc(){
    ...
    };
    上下等价
    window abc = function (){
    ...
    };
    上下等价
    this.abc = function (){
    ...
    };这些,都是 bbjbepzz  的功劳!
      

  17.   

    总结一下:
    bbjbepzz 已经把问题说得行清楚了!
      name="小黄";
    上下等价
      window.name="小黄";
    //
    //下面是声明一个func 
    function abc(){
    ...
    };
    上下等价
    window abc = function (){
    ...
    };
    上下等价
    this.abc = function (){
    ...
    };这些,都是 bbjbepzz  的功劳!
      

  18.   

    不用var,创建的是全局变量。
      

  19.   

    bbjbepzz 已说得很清楚了。
    我总结一下:
      
       thisYear = "2011";  
     上下行价:
       window.thisYear = "2011";  
    下面是function 的例子:
    以下三种方式 声明 都是等价的, (就是就,下面三种方法,你写哪一种,结果一样!)
    //声明方式一
    function a(){alert("a")}
    //声明方式二
    a = function (){alert("a")};
    //声明方式三
    window.a = function (){alert("a")};
    这些都要的归功于bbjbepzz  !
         再次感谢!
      

  20.   


    看看一下的代码,为什么用window的属性方式都能访问到变量?<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'TestWithoutVar.jsp' starting page</title>
        
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
        <script type="text/javascript">
        str = "没有var关键字的变量其实就是window的一个属性";
        var str2 = "带var的变量";
        </script>
      </head>
      
      <body>
        This is my JSP page. <br>
        <script type="text/javascript">
        alert(window.str);
        alert(window.str2);
        </script>
        
      </body>
    </html>
      

  21.   

    我感觉用不用var都行。
    var dog = function (name)

    this.Name = name;
    };与下面的有什么不同,请指教。
    JScript code
    var dog = function (name)

    var Name = name;
    };
    这个问题,我认为上面的是己经定义了Name做为全局变量,下面是刚定义做为局部变量
      

  22.   

    var声明的全局变量MS也是window的一个属性啊~....
      

  23.   

    <script type="text/javascript">
    attribute=10; //给window对象添加一个属性attribute
    alert(attribute); //弹出属性的值
    var flag = delete window.attribute; //删除window的attribute属性
    alert(flag); //弹出true,证明属性删除成功了
    //alert(attribute); //这里会报错,因为window的attribute属性已经被删除了
    var variable=10; //声明一个变量
    alert(variable); //弹出变量variable的值
    flag = delete window.variable; //删除window的属性
    alert(flag); //弹出false,删除window属性失败,因为variable是一个变量,不是window的属性
    alert(variable); //弹出变量variable的值
    </script>
    你运行一上面的代码就知道有没有var区别了。
    你说的那两句代码的不同,我认为如下:第一种是面向对象的写法,dog就相当一个类,也是构造方法,第二种就只是一个普通的方法。