zoukankan      html  css  js  c++  java
  • js函数

    JS函数

    函数概述

    函数的声明方式

    <script>
    function fn(){
    	
    }</script>
    

    函数的表达式:将一个匿名函数赋值给一个新的变量

    <script type="text/javascript">
    	var hello = function(x,y){
    		return x + y;
    	}
    	console.log(hello);
    </script>
    
    <script type="text/javascript">
    	var hello = function fn(x,y){
    		return x + y;
    	}
    	console.log(hello);
    </script>
    

    构造函数

    <script>
    var fn = new Function('return 5');
    console.log(fn);
    var fw = new Function('x','y','return x+y')';
    console.log(fw);
    </script>
    

    函数参数

    <script type="text/javascript">
    	function fn(a,b,c){
    		console.log(a,b,c);
    	}
    	
    </script>
    

    函数的形参只能在函数的外部使用。

    <script type="text/javascript">
    	function fn(){
    		try{
    			....
    		}catch(e){
    			return e;
    		}finally{
    			return 0;
    		}
    	}
    	console.log(fn);
    	
    </script>
    

    如果函数调用在前面加上new前缀,且返回值不是一个对象或者没有返回值,则返回该对应的值

    <script>
    function fn(){
    	this.a = 2;
    	return 1;
    
    }
    var test = new fn();
    console.log(test);
    console.log(test.constructor);
    
    function fn(){
    	return;
    }
    </script>
    

    函数调用

    函数调用的四种方式

    <!DOCTYPE html>
    <html lang="zh">
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<meta http-equiv="X-UA-Compatible" content="ie=edge">
    	<title>函数调用
    	</title>
    </head>
    <body>
    <script>
    	//函数调用4中方式:函数调用模式,方法调用模式,构造调用模式 间接调用模式
    	
    	//函数调用模式
    	function add(x,y){
    		'use strict';//严格模式
    		//在严格模式下,当前函数中的this指向undefined
    		console.log(this);//window对象  在非严格模式
    		return x + y;
    	}
    	var sum = add(3,4);
    	console.log(sum);
    </script>
    </body>
    </html>
    

    注意:小心避免全局的属性重写带来的问题
    方法调用模式
    var obj = {
    //这个fn称为obj对象的方法
    a = 1;
    fn:function(){
    console.log(this);
    console.log('被调用了');
    },
    fn2:function(){
    this.a = 2;
    }
    }
    obj.fn();
    obj.fn2();
    console.log(obj.a);

    构造函数调用模式
    function fn(){
    this.a = 1;
    }
    //this指向问题:当做普通函数调用this指向window,当做构造函数调用,this指向当前函数,当做对象的方法

    var obj = new fn();
    console.log(obj);
    间接调用模式
    function sum(x,y){
    return x +y;
    }
    console.log(sum(1,3));// console.log(sum.call(obj,1,2)); // console.log(sum.apply(obj,1,2));

    函数参数

    arguments
    函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型的。甚至可以不传参。

    <!DOCTYPE html>
    <html lang="zh">
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<meta http-equiv="X-UA-Compatible" content="ie=edge">
    	<title></title>
    </head>
    <body>
    <script type="text/javascript">
    	//arguments
    	function add(x){
    		return x + 1;
    </script>	
    </body>
    </html>
    

    在非严格模式下,函数中可以出现同名的形参。
    实参比形参的个数少,剩下的形参都将设置为undefined。
    aeguments不是真正的数组,它是类素组,它是通过[]来访问它的每一个元素

    函数重载

    <!DOCTYPE html>
    <html lang="zh">
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<meta http-equiv="X-UA-Compatible" content="ie=edge">
    	<title></title>
    </head>
    <body>
    	<script type="text/javascript">
    		//定义相同的函数名,传入不同参数。
    		function add(a){
    			return a + 100;
    		}
    		function add(a,b){
    			return a + b + 100;
    		}
    		alert(add(10));
    	</script>
    </body>
    </html>
    

    在js中函数不存在重载现象。

    <!DOCTYPE html>
    <html lang="zh">
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<meta http-equiv="X-UA-Compatible" content="ie=edge">
    	<title></title>
    </head>
    <body>
    	<script type="text/javascript">
    		//定义相同的函数名,传入不同参数。
    		function add(a){
    			if(arguments.length == 0){
    				return 100;
    			}else if(arguments.length == 1){
    				return arguments[0] +100;
    			}else if(arguments.length == 2){
    				return arguments[0] + arguments[1]+ 100;
    			}
    	</script>
    </body>
    </html>
    

    参数传递

    基本数据类型

    <!DOCTYPE html>
    <html lang="zh">
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<meta http-equiv="X-UA-Compatible" content="ie=edge">
    	<title></title>
    </head>
    <body>
    	<script type="text/javascript">
    		function add(num){
    			num = num +100;
    			return num;
    		}
    		var count = 20;
    		var result = add(count);
    		console.log(result);
    	</script>
    </body>
    </html>
    

    函数属性

    <!DOCTYPE html>
    <html lang="zh">
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<meta http-equiv="X-UA-Compatible" content="ie=edge">
    	<title></title>
    </head>
    <body>
    <script type="text/javascript">
    	function add(x,y){
    		console.log(arguments.length);实参属性   4个属性
       		console.log(add.length);形参属性         2的属性
    		
    	}
    	add(2,3,4,5)
    </script>	
    </body>
    </html>
    

    name指的是当前函数的名字

    <!DOCTYPE html>
    <html lang="zh">
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<meta http-equiv="X-UA-Compatible" content="ie=edge">
    	<title></title>
    </head>
    <body>
    <script type="text/javascript">
    	function fn(){
    		
    	};
    	console.dir(fn.name);//fn
    	var fn2 = function(){};
    	console.log(fn2.name);//fn2
    	var fn3 = function abc(){};
    	console.log(fn3.name);//abc
    </script>	
    </body>
    </html>
    

    prototype 属性
    每个函数都有一个prototype属性

    <!DOCTYPE html>
    <html lang="zh">
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<meta http-equiv="X-UA-Compatible" content="ie=edge">
    	<title></title>
    </head>
    <body>
    <script type="text/javascript">
    	function fn(){
    		
    	};
    	console.log(fn.prototype);
    	fn.prototype.a = 1;
    	console.log(fn.prototype);
    </script>	
    </body>
    </html>
    

    函数的方法

    call和apply

    <!DOCTYPE html>
    <html lang="zh">
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<meta http-equiv="X-UA-Compatible" content="ie=edge">
    	<title></title>
    </head>
    <body>
    <script type="text/javascript">
    	function fn(){
    		
    	};
    	var obj = new fn();
    	fn.prototype.a = 1;
    	console.log(obj)
    	//apply()  call()
    	//每个函数都博涵两个非继承而来的方法
    	window.color = 'red';
    	console.log(window);
    	function sayColor(){
    		console.log(this.color);
    	}
    	sayColor();
    	sayColor.call(this);
    	sayColor.call(window);
    	sayColor.call(obj);
    </script>	
    </body>
    </html>
    

    call和apply方法的应用
    找出数组的最大元素

    <!DOCTYPE html>
    <html lang="zh">
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<meta http-equiv="X-UA-Compatible" content="ie=edge">
    	<title></title>
    </head>
    <body>
    <script type="text/javascript">
    	//找出数组中最大元素
    	var mx = Math.max(2,3,4,5,6);
    	var arr = [2,1,10,30,39];
    	var arrMax = Math.max.apply(null,arr);
    	console.log(arrMax);
    	
    </script>	
    </body>
    </html>
    

    将类数组转换成真正的数组

    <!DOCTYPE html>
    <html lang="zh">
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<meta http-equiv="X-UA-Compatible" content="ie=edge">
    	<title></title>
    </head>
    <body>
    <script type="text/javascript">
    	//将类数组转换成真正的数组
    	function add(){
    		var arr = Array.prototype.slice.apply(arguments);
    		console.log(arr);
    	}
    
    	add(1,2,3);
    	//数组追加
    	var arr = [];
    	Array.prototype.push.apply(arr,[1,2,3,4]);
    	console.log(arr);
    	Array.prototype.push.apply(arr,[8,9,0]);
    	console.log(arr);
    	//利用call和apply做继承
    	function Animal(name,age){
    		this.name = name;
    		this.age = age;
    		this.sayAge = function(){
    			console.log(age);
    		}
    	}
    	function Cat(){
    		//继承Aimal
    		Animal.call(this);//把this指向了c实例对象
    	}
    	var c = new Cat('xxx',20);
    	c.sayAge();
    	console.log(c.name);
    </script>	
    </body>
    </html>
    
    

    bind方法

    es5新增的方法,主要作用:将函数绑定到某个对象中,并有返回值(一个函数)

    <!DOCTYPE html>
    <html lang="zh">
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<meta http-equiv="X-UA-Compatible" content="ie=edge">
    	<title></title>
    </head>
    <body>
    <script>
    function fn(y){
    	return this.x + y;
    }
    var obj = {
    	x:1
    }
    var gn = fn.bind(obj);
    console.log(gn(3));
    </script>
    </body>
    </html>
    
    
    <!DOCTYPE html>
    <html lang="zh">
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<meta http-equiv="X-UA-Compatible" content="ie=edge">
    	<title></title>
    </head>
    <body>
    <script>
    function getConfig(colors,size,otherOptions){
    	console.log(colors,size,otherOptions);
    }
    var defaultConfig = getConfig.bind(null,'#ff6700',1024*768);
    defaultConfig('123');
    </script>
    </body>
    </html>
    
    
  • 相关阅读:
    合并两个有序链表
    有效括号方法二
    有效括号
    es6 中的模块化
    XMLHttpRequest 对象
    AST
    php读写文件方式
    vue开发中遇到的问题
    sublime操作
    cmd命令
  • 原文地址:https://www.cnblogs.com/pythonliuwei/p/13522074.html
Copyright © 2011-2022 走看看