JS基础笔记-关于函数

114 阅读5分钟

函数

函数也是一个对象;类型是function;韩式就是封装了一段可以被重复执行调用的代码块;

目的:就是让大量代码重复使用。

封装到函数的代码不会立即执行,调用的时候才会执行;
调用的语法:函数对象();
fun();

创建一个函数

  1. 利用构造函数(少用)

var fun = new Function("console.log('hello');");

  1. 使用函数声明来创建一个函数

     语法: function 函数名 ( [ 形参1,形参2...形参n ] ){  
                 语句...
            }
            
      举例:
        function fun2() {
     	console.log("hello");
          }
        fun2();
    
  2. 使用函数声明来创建一个函数

      var 函数名= function( [ 形参1,形参2...形参n ] ){  
                 语句...
       }
       
       举例:
       var fun3 = function () {
     	console.log("你好");
       };//赋值语句
     fun3();
    

函数的参数

定义一个用来求两个数和的函数

    	function sum(a, b) {//相当于函数里面有 var a; var b;
           console.log(a + b);
	}
	sum(2, 4);
  • 多个形参之间用逗号隔开,声明形参就相当于在函数内部声明了对应过的变量,但是并不赋值;
  • 调用函数的时候,可以在()内指定实参;
  • 实参将会赋值给函数中对应的形参;
  • 调用函数时解析器不会检查实参的类型和数量,多余的实参参不会被赋值,少的话没有对应的实参的形参,返回结果是undefined;

函数的返回值

可以用return 来设置函数得到返回值

语法: return 值

return后的值将会作为函数的执行结果返回,可以定义一个变量来接受该结果;

        // 创建一个函数——3个数求和
	function sum(a, b, c) {
		var d = a + b + c;
		return d;  //return 后的语句不会执行;
                    alert("hello");//  不会执行
	}

	// 调用函数
	// 变量result的值就是函数的执行结果
	var result = sum(1, 2, 3);
  • return 后面的语句不会执行;

  • return 后面没有返回值,结果就是undefined;

  • 函数中没有return ,结果也是undefined;

     //判断一个数是否为偶数,是true,不是false
     function tt(num) {
     	if (num % 2 == 0) {
     		return true;
     	} else {
     		return false;
     	}
     }
    
     // 改写:
     function tt(num) {
     	return num % 2 == 0;//这个式子本身就是逻辑判断,结果就是逻辑值;
     }
    
     var result = tt(15);
     console.log("答案就是:" + result);
    
  • 参数较多的时候,可以把实参封装成一个对象,通过对象进行传递;

        function user(o) {
          console.log("我的名字叫做" + o.name + "我今年" + o.age + "岁了" + "性别" + o.gender);
    }
    var obj = {
    	name: "lahuan",
    	age: 18,
    	gender: "女",
    	address: 1233442
    };
    user(obj);
    
  • 实参为函数:

     function fun(a) {
       console.log(a);  //ƒ () { alert("hello") } 
       //a(); // 弹框"hello"
     }
    
     fun(function () { alert("hello") });
    

注意区别:

  • fun(fun2())
    调用函数,相当于使用函数fun2的返回值
  • fun(fun2)
    函数对象,相当于直接使用函数对象fun2

注意return、continue、break的区别:

	function fun() {
		alert("123");
		for (var i = 0; i < 5; i++) {
			console.log(i);
			if(i==2){
				return;
                                // return直接结束函数,break直接结束for循环,continue继续i=3的for循环
			}
		}

		alert("456");//return 这条不执行,continue和break这条执行
	}
	fun(); // "123",0,1

返回值可以是对象也可以是函数
函数里面套函数

    		function fun3() {
                    // 在函数内部再声明一个函数
		function fun4() {
			console.log("hello");
		}
		fun4();
	}

	fun3();
            
      function fun3() {
                    function fun4() {
			console.log("hello");
		}
		
		return fun4; //fun4函数对象作为函数的返回值返回

		return fun4();// hello undefined, fun4没有返回值
	}

	a = fun3();
	console.log(a);

立即执行函数

函数定义完,立即执行,这种函数叫做立即执行函数,

立即执行函数往往只执行一次

    //若没有外层的小括号,就会报错,因为函数的名字没有,也灭有赋值给一个变量,参考前面函数的两种常用写法
	(function () {
		alert("我是一个匿名函数");
	})();
         
        (function (a,b) {
		console.log(a+b);
	})(12,34);

函数也可以作为对象的属性——方法

    	var obj = {
		name: "孙悟空",
		age: 18,
		fun: function () {
			console.log(obj.name);
		}
	}
	obj.fun();  //   调用方法,返回值"孙悟空"

如果一个函数作为一个对象的属性保存,那么我们称这个函数就是对象的方法,只是名称的区别; document.write(); console.log();这些都是方法

作用域

作用域指一个变量的作用范围

全局作用域

  1. 直接编写再script标签中的JS代码,都在全局作用域;
  2. 全局作用域再页面打开时创建,再页面关闭时销毁;
  3. 在全局作用域中有一个全局对象window(代表一个浏览器窗口),我们可以直接使用;
  4. 在全局作用域中,创建的变量都会作为window对象的属性保存;
  5. 在全局作用域中,创建的函数都会作为window对象的方法保存;

变量的声明提前

    	console.log(a);
	var a = 12;  //undefined


	// 相当于
	var a;
	console.log(a);
	a=12;
            
            //若没有var,则不会提前声明
  • 使用函数声明形式的函数 function(){} 会在所有代码执行之前被创建

  • 使用函数表达式创建函数,不会被提前创建

      fun();//执行成功
      fun2();//报错
      function fun() {
      	console.log("我是函数1");
      }
    
      var fun2 = function () {
      	console.log("我是函数2");
      }
    
              
    

函数作用域

  • 调用函数时创建函数作用域,函数执行完毕后,函数作用域销毁;

  • 每调用一次函数就会创建一个新的函数作用域,他们之间互相独立;

  • 函数作用域中可以访问到全局作用域的变量,反之不行;

  • 函数中的变量先在自己的函数作用域中找,若没有找上一级找,若全局作用域中也没有,则会报错(就近原则);

  • 在函数中要想访问全局变量,就用window对象;

  • 在函数作用域中,使用var关键字声明的变量,也有变量声明提前的特性;

  • 在函数中没有用var声明的变量就是全局变量;

      // 案例1:
      var c = 33;
      function fun() {
      	console.log(c); //找上一级
      	c = 10;//相当于 window.c
      }
      fun();
      console.log(c);//10
    
      // 案例2
      var c = 33;
      function fun() {
      	console.log(c); //undefined
      	var c = 10;
      }
      fun();
      console.log(c);//33
    
              
    

枚举对象中的属性

使用 for ... in 语句

语法格式:
for (var 变量 in 对象){

}

    	var obj = {
		name: "lahuan",
		age: 18,
		gender: "女",
		address: 1233442
	};
	for (var n in obj) {
		console.log(n); //返回对象中所有的属性名
		console.log(obj[n]); //中括号可以取变量 返回属性值
	}