JS学习笔记(三)函数

时间:2022-02-04 11:45:13

 js中的方法名一般都是首字母小写,其余单词首字母大写的规范。

  声明

  function 函数名(参数列表) {
      // 函数体
      return 返回值;
  } 

  调用

    函数名(); 

(js中花括号喜欢用这种方式,因为在以前的浏览器中会在每行js代码的末尾添加分号,但现在的浏览器一般已经兼容这种写法,但仍保留这种习惯。)

  需要注意的是只有在js的函数中声明的对象才具有块级作用域。函数中变量一定要定义,否则就是全局变量。

  在解释js的时候,会先将其读入内存进行解释,再一步一步的从上到下的执行代码。js的函数也是变量值,即可以把函数赋值给变量。

   function func1 () {
   // 代码体
   }
   var myFunc;
   myFunc = func1;
   //直接使用myFunc代替func1
   //或者
   var func = function() {
   // 这是一个Lambda函数,也称为匿名函数
   };
   func();

  如果函数中声明的变量名或函数名和对应全局的变量名或函数名一致,则会覆盖全局对象。

调试
  js只能在浏览器中进行调试,如使在FireFox浏览器中安装firebug插件进行调试,而chorme可直接右键选项进行调试。

变量名提升和函数名提升

  函数中的成员具有局部作用域,会出现变量名提升和函数名提升的问题。

如  var func = function(){

    alert(i);

   }

   func();

  程序执行时,先进入func()函数的函数体中,然后执行alert(i),此时会先在函数体内寻找变量i,因为找不到,所以跳到上一级作用域链中,由于函数定义代码之前还是没有变量i的定义,所以程序报错(i is undefined)。

但是如下情况 

  var func = function(){
    alert(i);
    var i = 456;
    alert(i);
  };
  func();

程序不会报错,会先弹出undefined,再弹出456。

上面程序相当于

  var func = function(){

    var i;
    alert(i);
    var i = 456;
    alert(i);
  };
  func();

 所以不会报错。这就是变量名提升,函数名提升同理。 

构造函数

  在js中没有类的概念,但是有函数,函数可以作为构造函数来使用

使用方法
  声明一个函数(构造函数) new 的方式创建对象,模拟类的样子进行创建

   function Person(n, a, s) {
   // 如果需要为对象添加属性(字段)
   // 使用 this.属性名 = 值
   this.name = n;
   this.age = a;
   this.sex = s;
   this.say = function() {
         alert("我是" + this.name);
        };
   }
   // 当类来用
   // 创建对象使用new 关键字
   var p = new Person("杨洪波", 29, "女");
   p.say();
   alert(p.name);
   alert(p.sex);
   alert(p.age);

给对象动态的添加成员
  var o = {};
  o.say = function() {
    alert("你好, 我是" + this.name);
  };
  o.say();
如果对象不具备这个属性,那么用对象去访问就会得到undefined。可以用来验证浏览器是否具备某个方法,写类库的时候,用来判断前面是否已经定义过这个方法,保证方法的可用。

删除对象成员
  使用delete运算符
语法: boolean delete 属性或变量或数组成员;

 如  delete o.say;

可以删除没有使用var声明的变量(所以变量的声明一定要加var关键字)