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>

原文地址:https://www.cnblogs.com/pythonliuwei/p/13522074.html