Javascript 函数声明、调用、闭包
1 # Javascript 函数声明、调用、闭包 2 # 一、函数声明 3 # 1.直接声明。浏览器在执行前,会先将变量和函数声明进行提升。 4 fn(); 5 function fn () { 6 console.log('test'); 7 } 8 fn(1); # var fn1; 被提升。这里调用会报错未定义 9 var fn1 = function () { 10 console.log('test'); 11 } 12 # 2.根据条件申明函数。现在最新版本的浏览器不会进行提升。但老的浏览器会提升。 13 if (true) { 14 function fn () { 15 console.log('true'); 16 } 17 } else { 18 function fn () { 19 console.log('false'); 20 } 21 } 22 # 3.new Function()来创建函数。说明函数也是对象。我们可以通过dir查看函数的属性和方法。 23 var fn = new Function('a', 'b', 'var name="zhangsan";console.log(name);console.log(a+b);'); # 创建函数 24 fn(1,2); # 调用,对应a,b参数 25 console.log(dir(fn)); # 查看函数中有哪些属性 26 # .通过dir查看到的属性有: 27 fn.arguments # 伪数组 获取到的是函数的实参 28 fn.caller # 函数的调用者,在全局调用的时候caller是null 29 fn.name # 函数名,字符串类型 30 fn.length # 函数实参的个数 31 32 # 二、函数的调用。函数中的this是由调用的时候来确定。 33 # 1.普通调用 34 function fn(){ 35 console.log(this); # window 36 } 37 # 2.方法调用 38 var obj = { 39 fn: function () { 40 console.log(this); # 这里是obj 41 } 42 } 43 # 3.作为构造函数,也就是通过new来构造对象 44 function fn(){ 45 console.log(this); # fn 46 } 47 new fn(); 48 # 4.作为事件的处理函数 触发事件的对象 49 btn.onclick = function () { 50 console.log(this); # btn 51 } 52 # 5.作为定时器的参数 53 setInterval(function () { 54 console.log(this); # window 55 }, 100); 56 57 # 6.通过bind、call、apply调用 58 function fn(x,y){ 59 console.log(this); 60 console.log(x+y); 61 } 62 obj = { 63 name: "zs" 64 } 65 fn1 = fn.bind(obj, 1, 2); 66 fn1(); # 需手动调用。this为obj 67 fn.call(obj, 1, 2); # 直接调用,this为obj 68 # .伪数组 69 arr = { 70 0: 100, 71 1: 21, 72 2: 43, 73 3: 55, 74 length: 4 75 } 76 arr['4'] = 7; 77 arr.length++; 78 Array.push.call(arr,30); # 伪数组中添加数据。arr对象的length会自动加1 79 # ..apply(this,[arr]) 将数组中的每项展开做参数传递给函数 80 var arr = [1,2,3,2,1,5,1,7,22,1];# 因为Math.max不能直接处理数组,所以我们需要用apply去处理 81 Math.max.apply(Math,arr); # 这样就求得了arr数组中的最大值了 82 83 # 三、高阶函数:以函数作为参数或者返回值的函数就叫高阶函数。 84 # .排序示例: 85 Array.prototype.mySort = function (fn) { 86 for (var i = 0; i < this.length-1; i++){ 87 var isSort = true; 88 for (var j = 0; j< this.length - i - 1; j++){ 89 if (fn(this[j], this[j1]) > 0){ # 这里通过函数来决定大小顺序排序 90 ifSort = false; 91 var tmp = this[j]; 92 this[j] = this[j+1]; 93 this[j+1] = tmp ; 94 } 95 } 96 } 97 } 98 var arr = [12,32,21,2,3]; 99 arr.mySort(function (a,b){ return a-b;}); # 调用 100 # ..高阶函数之闭包:Closures(闭包)是使用被作用域封闭的变量,函数,闭包等执行的一个函数的作用域。通常我们用和其相应的函数来指代这些作用域。(可以访问独立数据的函数) 101 function getFun(n) { 102 return function (m) { 103 return n+m; 104 } 105 }