JavaScript学习第八天笔记(Function)
Function
函数是这样一段JavaScript代码 它只定义一次 但可能被执行或调用多次,Function类型是JavaScript提供的引用类型之一 通过Function类型创建Function对象。在JavaScript中,函数也是以对象的形式存在的,每个函数都是一个Function对象。
定义函数的三种方法
/*1.函数的声明方式*/ function fun() { console .log('this is a function'); } fun(); /*2.字面量方式*/ var fn = function () { console.log('this is a function'); } fn(); /*3.创建Function类型的对象(就是一个函数)*/ var fun3 = new Function ('a','console.log(a)'); fun3(100); /*语法: var 函数名 = new Function('参数','函数体'); */
Object与Function
/*1.Object与Function都是自身类型*/ console .log(Object instanceof Object);//true console .log(Function instanceof Function);//true /*2.Object自身是构造函数,所有的函数都是Function类型*/ console .log(Object instanceof Function);true /*3.Function是引用类型,用于创建对象,是对象都是Object类型*/ console .log(Function instanceof Object);
Function属性
apply方法
Function的apply()方法用于调用一个函数 并且接受指定的this值 以及一个数组作为参数
/*定义一个函数*/ function fun (value){ console .log('this is '+value); } /*第一种调用形式,语法结构:函数名称()*/ fun('10'); /*2.第二种调用方式*/ /*apply (thisArg,argArry)方法 * 参数 thisArg-this argArry-数组,作为参数(实参的列表) */ fun.apply(null,['tn']);
call方法
Function的call()方法用于调用一个函数 并且接受指定的this值作为参数 以及参数列表
/*定义一个函数*/ function fun(value){ console .log('this is '+value); } /*1.函数调用*/ fun (100); /*2.apply方式调用*/ fun.apply(null,[100]); /*3.call方法调用*/ fun.call(null,100); /*语法结构:函数名.call(thisArg,arg1,arg2,...)*/
bind方法
语法:
bind(thisArg,arg1,arg2,arg3....)
*作用:用于创建一个新函数(成为绑定函数)
参数
*thisArg-this * arg1,arg2...-表示参数列表 * 返回值-表示返回新的函数
function fun (value){ console .log('this is '+ value); } fun('20'); var f = fun.bind(null,50); f();
arguments对象
由于JS的函数中,不存在重载,所以使用arguments对象实现模拟重载
function add(){ var num= arguments.length; switch(num){ 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(0,1)); console .log(add(0,1,2)); console .log(add(0, 1,2,3));
函数的递归
调用自身的函数被称之为递归函数 在某种意义上说 递归近似于循环 两者都有重复执行相同的代码 并且两者都需要一个终止条件以避免无限循环或者无限递归
function fn(v){ console.log(v); if (v >= 10) { return; } // fn(v + 1); arguments.callee(v + 1); } // fn(0); var f = fn; fn = null; f(0); // console.log(f);
特殊函数
匿名函数
匿名函数的作用:
1.将匿名函数作为参数传递给其他函数 -> 回调函数
2.将匿名函数用于执行一次性任务 -> 自调函数
回调函数
当一个函数作为参数传递给另一个函数时,作为参数的函数被称之为回调函数
var one = function(){ return 1; } function fn(v){ return v(); }
或者是
var result = fn(function(){return 1;}); console.log(result);
自调函数
所谓自调函数就是在定义函数后自行调用
/* 自调函数 - 定义即调用的函数 * 第一个小括号 - 用于定义函数 * 第二个小括号 - 用于调用函数 */ // 全局作用域 - 生命周期:JavaScript文件从执行到执行完毕 (function(value){ // 函数作用域 - 生命周期:从函数调用到调用完毕 console.log('this is ' + value); })('function'); // 表达式语法 (function(value){ // 函数作用域 - 生命周期:从函数调用到调用完毕 console.log('this is ' + value); }('function')); !function(value){ // 函数作用域 - 生命周期:从函数调用到调用完毕 console.log('this is ' + value); }('function'); +function(value){ // 函数作用域 - 生命周期:从函数调用到调用完毕 console.log('this is ' + value); }('function');
作为值的函数
将一个函数作为另一个函数的结果进行返回,作为结果返回的函数称之为作为值得函数
var one = function(){ return 100; } function fun(){ var v = 100; return function(){ return v; }; }
闭包
概述
JavaScript允许函数嵌套,并且内部函数可以访问定义在外部函数中的所有变量和函数,以及外部函数能访问的所有变量和函数。但是,外部函数却不能够访问定义在内部函数中的变量和函数。当内部函数以某一种方式被任何一个外部函数作用域访问时,一个闭包就产生了。闭包就是该函数能使用函数外定义的变量。
特点
1.局部变量:在函数中定义有共享意义(如:缓存、计数器等)的局部变量。(注意:定义成全局变量会对外造成污染)
2.内部函数:在函数(f)中声明有内嵌函数,内嵌函数(g)对函数(f)中的局部变量进行访问
3.外部使用:函数(f)向外返回此内嵌函数(g),外部可以通过此内嵌函数持有并访问声明在函数(f)中的局部变量,而此变量在外部是通过其他途径无法访问的
作用
1.提供可共享的局部变量
2.保护共享的局部变量 提供专门的读写变量的函数
3.避免全局污染