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 }

 

posted @ 2022-02-22 10:41  看一百次夜空里的深蓝  阅读(153)  评论(0编辑  收藏  举报