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

Javascript 函数声明、调用、闭包的更多相关文章

  1. JavaScript函数表达式、闭包、模仿块级作用域、私有变量

    函数表达式是一种非常有用的技术,使用函数表达式可以无需对函数命名,从而实现动态编程.匿名函数,是一种强大的方式,一下总结了函数表达式的特点: 1.函数表达式不同于函数声明,函数声明要求有名字,但函数表 ...

  2. JavaScript 函数声明,函数表达式,匿名函数,立即执行函数之区别

    函数声明:function fnName () {-};使用function关键字声明一个函数,再指定一个函数名,叫函数声明. 函数表达式 var fnName = function () {-};使 ...

  3. 详解Javascript 函数声明和函数表达式的区别

    Javascript Function无处不在,而且功能强大!通过Javascript函数可以让JS具有面向对象的一些特征,实现封装.继承等,也可以让代码得到复用.但事物都有两面性,Javascrip ...

  4. javascript 函数声明与函数表达式的区别

    先看一段代码 var f = function g() { return 1; }; if (false) { f = function g(){ return 2; }; } alert(g()); ...

  5. JavaScript 函数声明,函数表达式,匿名函数的区别,深入理解立即执行函数(function(){…})()

    function fnName(){xxxx}; // 函数声明:使用function关键字声明一个函数,在指定一个函数名. //例如:(正常,因为 提升 了函数声明,函数调用可以在函数声明之前) f ...

  6. 深入理解javascript函数参数与闭包(一)

    在看此文章,希望先阅读关于函数基础内容 函数定义与函数作用域 的章节,因为这篇文章或多或少会涉及函数基础的内容,而基础内容,我放在函数定义函数作用域 章节. 本文直接赘述函数参数与闭包,若涉及相关知识 ...

  7. javascript函数声明方式

    javascript中函数的声明有三种方式: 最常见的函数声明: fun();//可以调用,因为这种声明方式会被浏览器优先加载. function fun() { alert("声明式的函数 ...

  8. javascript 函数声明和函数表达式的区别(学习笔记)

    javascript中声明函数的方法有两种:函数声明式和函数表达式. 区别如下: 1).以函数声明的方法定义的函数,函数名是必须的,而函数表达式的函数名是可选的. 2).以函数声明的方法定义的函数,函 ...

  9. javascript函数自调用

    1. 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. 2.  将函数用 “()”括起来, 后面再加一个“()” 3.  javascript函数的内置对象arguments对象,  它包 ...

随机推荐

  1. Grafana+Prometheus 搭建 JuiceFS 可视化监控系统

    作为承载海量数据存储的分布式文件系统,用户通常需要直观地了解整个系统的容量.文件数量.CPU 负载.磁盘 IO.缓存等指标的变化. JuiceFS 没有重复造轮子,而是通过 Prometheus 兼容 ...

  2. GoF的23种设计模式的功能

    GoF的23种设计模式的功能 前面说明了 GoF 的 23 种设计模式的分类,现在对各个模式的功能进行介绍. 单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取 ...

  3. vue面试总结-2022

    1.vue生命周期及各周期得特点 beforCreate 特点: 初始化实例,不能使用data和methods.ref 示例 beforeCreate: function () { console.g ...

  4. ES6 - promise(1)

    今天决定对之前学过的一些前端的知识进行梳理和总结,因为最近都是独自承担项目的开发与搭建,所以先从前后端交互的第一线axios来梳理,复习axios首先一定要先复习promise对象. 什么是promi ...

  5. 开源的.Net 工作流引擎Elsa初试——创建工作流服务器和图形化工作流配置管理应用

    微软的Workflow Foundation基于.Net Framework,并且没有向.Net Core迁移的计划.我们的很多项目使用了工作流引擎,这些项目向.Net Core以及更高版本迁移时遇到 ...

  6. .NET C#杂谈(1):变体 - 协变、逆变与不变

    0. 文章目的:   介绍变体的概念,并介绍其对C#的意义 1. 阅读基础   了解C#进阶语言功能的使用(尤其是泛型.委托.接口) 2. 从示例入手,理解变体   变体这一概念用于描述存在继承关系的 ...

  7. 一文带你了解J.U.C的FutureTask、Fork/Join框架和BlockingQueue

    摘要: J.U.C是Java并发编程中非常重要的工具包,今天,我们就来着重讲讲J.U.C里面的FutureTask.Fork/Join框架和BlockingQueue. 本文分享自华为云社区<[ ...

  8. synchronized下的 i+=2 和 i++ i++执行结果居然不一样

    起因 逛[博客园-博问]时发现了一段有意思的问题: 问题链接:https://q.cnblogs.com/q/140032/ 这段代码是这样的: import java.util.concurrent ...

  9. el-select数据量过大引发卡顿,怎么办?

    本文分享自华为云社区<解决el-select数据量过大的卡顿的两种思路与一种实施方案>,作者: KevinQ. 经典问题:在测试环境好好的,怎么到正式环境就不行了? --本文:数据量变了. ...

  10. 2022giao考游记

    Day -12: 今年高考准备去考着玩玩,考前心态十分稳健.~~毕竟我才高一/cy~~ 这次高考我倒是没啥目标,主要是来试试水,感受一下高考的氛围,体会一下自己和高三应届生们的水平的差距.也算是丰富自 ...