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>
    
    
  • 相关阅读:
    UVa 116 单向TSP(多段图最短路)
    POJ 1328 Radar Installation(贪心)
    POJ 1260 Pearls
    POJ 1836 Alignment
    POJ 3267 The Cow Lexicon
    UVa 1620 懒惰的苏珊(逆序数)
    POJ 1018 Communication System(DP)
    UVa 1347 旅行
    UVa 437 巴比伦塔
    UVa 1025 城市里的间谍
  • 原文地址:https://www.cnblogs.com/pythonliuwei/p/13522074.html
Copyright © 2011-2022 走看看