JS(JavaScript)数组
一.Function类型
概述
1.Function与函数;闭包
// 函数声明方式 function fun(){ console.log('you my function'); } // 字面量方式 var fn = function(){ console.log('you my function too'); } // 判断函数是否为Function类型 console.log(fun instanceof Function);// true console.log(fn instanceof Function);// true // JS中全部函数都是Function类型的对象 /* 3.建立Function类型的对象-是个函数 var 函数名 = new Function(参数,函数体); * 因为函数的参数和函数体都是以字符串形式传递给Function */ var f = new Function('a','console.log(a)'); f(100);// 以函数方式进行调用
contstructor属性app
// 定义一个构造函数 function Hero(){ this.name = '犬夜叉'; this.sayMe = function(){ console.log('this is function'); } } // 使用构造函数建立对象 var hero = new Hero(); // 对象具备与构造函数相同属性和方法 console.log(hero.name); hero.sayMe(); // JavaScript中全部对象都是Object类型 console.log(hero.constructor);
Function的length属性函数
// Function类型的length属性-获取函数的参数(形参)个数 function fn(){ console.log('you my Inuyasha'); } fn(1,2,3,4,5); console.log(fn.length);// 0
2.Function类型;this
以指定this值,调用个函数,数组做为个参数code
// 定义函数 function fun(value){ console.log('this is ' + value); } // 函数的调用方式 fun('function');// 语法结构:函数名称() /* apply(thisArg,argArray)方法 -> 用于调用一个指定函数 * 参数 * thisArg - this * argArray - 数组,做为参数(实参)的列表 */ fun.apply(null, ['function']);
以指定this值为参数,调用个函数,以及参数列表对象
// 定义函数 function fun(value, value2){ console.log('this is ' + value); } // 函数的调用方式 fun('function', '犬夜叉');// 语法结构:函数名称() fun.apply(null, ['function','犬夜叉']); // call()方法 -> 用于调用一个函数 fun.call(null, 'function', '犬夜叉');
以指定this值为参数,建立个新函数,以及参数列表递归
// 定义函数 function fun(value){ console.log('this is ' + value); } /* bind(thisArg, arg1, arg2, ...)方法 * 做用 - 用于建立一个新函数(称为绑定函数) * 参数 * thisArg - this * arg1, arg2, ... - 表示参数列表 * 返回值 - 返回新的函数 */ // var f = fun.bind();// 相对于从指定函数复制一份出来 // console.log(f); // f(); fun('桔梗');// this is 桔梗 var f = fun.bind(null, '犬夜叉'); f();// this is 犬夜叉
在JS中函数是很么重载现象,若是同时定义多个同名函数的话,只有最后一个定义函数是有效的生命周期
function add(a,b) { return a + b; } function add(a,b,c) { return a + b + c; } function add(a,b,c,d) { return a + b + c + d; } /*重载含义 * 定义多个同名函数,但具备数量不一样的参数 * 调用函数,根据传递参数的个数调用指定函数 */ add(1,2); add(1,2,3); add(1,2,3,4); //JavaScript函数不存在重载 - 当函数同名时,最后一次定义函数有效 console.log(add(1,2));//NaN console.log(add(1,2,3));//NaN console.log(add(1,2,3,4));//10
/* 重载的含义 1.定义多个同名的函数,但具备数量不一样的参数 2.调用函数,根据传递参数的个数调用指定的函数 */ function add(a,b){ return a + b; } function add(a,b,c){ return a + b + c; } function add(a,b,c,d){ return a + b + c + d; } add(1,2);// 3 add(1,2,3);// 6 add(1,2,3,4);// 10 // JavaScript的函数不存在重载 -> 当函数同名时,最后一次定义的函数有效 console.log(add(1,2));// NaN console.log(add(1,2,3));// NaN console.log(add(1,2,3,4));// 10
arguments对象
arguments对象也是个类数组对象
length属性-函数实参的个数
用于接收函数参数至关于实参ip
/*function fn(){ console.log(arguments[0]); } console.log(fn.arguments);// null fn(1,2,3,4);*/ // 模拟函数的重载效果 function add(){ var len = arguments.length; switch (len) { case 2: return arguments[0] + arguments[1]; break; case 3: return arguments[0] + arguments[1] + arguments[2]; break; case 4: return arguments[0] + arguments[1] + arguments[2] + arguments[3]; break; } } console.log(add(1,2));// 3 console.log(add(1,2,3));// 6 console.log(add(1,2,3,4));// 10
在一个函数的函数内部,调用自身函数,有两种方法;
使用自身函数名实现
使用arguments对象的callee属性实现
//函数递归 - 指定函数的函数体中调用自身函数 /*function fun(){ // 当前函数的逻辑内容 console.log('you my function'); // 调用自身函数 -> 实现递归 fun(); } fun(); */ function fn(v) { console.log(v); if (v >= 10) { return; } arguments.callee(v + 1); } var f = fn; fn = null; f(0); // console.log(f);
3.特殊函数;
函数能够做为数据使用,做为函数本身,跟普通数据同样,不必定有名字
/* * function (){ * console.log('you my function'); }*/ /*匿名函数的做用: 将匿名函数做为参数传递给其余函数 -> 回调函数 将匿名函数用于执行一次性任务 -> 自调函数 */
当个函数做为参数传递给另外一个函数为回调函数
var one = function () { return 1; } function fn(v) { return v(); } //one函数是做为fn函数参数出现 - 并非调用 //var result = fn(one); /*等价于一些代码*/ var result = fn(function(){return 1;}); console.log(result);//1 /*代码中做为参数函数- 匿名回调函数*/
定义函数后自行调用
第一个小括号- 定义函数
第二个小括号- 调用函数
/* * 自调函数 - 定义即调用函数 * 第一个小括号- 定义函数 * 第二个小括号- 调用函数 */ //全局做用域 -生命周期;JS(JavaScript)文件从执行到执行完毕 (function (value) { console.log('you my' + value); // 函数做用域 -生命周期;从函数调用到调用完毕 })('function'); (function (value){ console.log('you my' + value); // 函数做用域 -生命周期;从函数调用到调用完毕 }('function')); !function (value) { console.log('you my' + value); // 函数做用域 -生命周期;从函数调用到调用完毕 }('function'); +function (value) { console.log('you my' + value); // 函数做用域 -生命周期;从函数调用到调用完毕 }('function');
将个函数做为另外一个函数的结果进行返回
var one = function () { return 100; } //做为值得函数 -内部函数的种特殊用法 function fun() { var v = 100; return function () { return v; }; } var result = fun(); console.log(result);//one函数 console.log(result());//100 console.log(fun()());
4.闭包;
一段JS代码,(全局代码和函数)都有个与关联的做用域链,并将做用域是个对象列表和链表
var a = 10;//全局变量 function fun() { var b = 100;//fun函数做用域的局部变量 function fn() { var c = 200;//fn函数做用域的局部变量 function f() { var d = 300;//f函数做用域的布部变量 //调用变量 console.log(a);//10 console.log(b);//100 console.log(c);//200 console.log(d);//300 } f(); //调用变量 console.log(a);//10 console.log(b);//100 console.log(c);//200 console.log(d);//d is not defined } fn(); //调用变量 // console.log(a);//10 // console.log(b);//100 // console.log(c);//c is not defined // console.log(d);//d is not defined } fun();
且内部函数能够访问定义在外部函数中的变量和函数,以及外部函数能访问全部变量和函数,外部函数不能访问内部函数中变量和函数
var n;//定义变量,但不初始化值 function fun() {//函数做用域 var v = 100; n = function(){ //进行初始化值-一个函数 console.log(v); } } fun(); n();//100