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 }

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. 796. Rotate String - LeetCode

    Question 796. Rotate String Solution 题目大意:两个字符串匹配 思路:Brute Force Java实现: public boolean rotateString ...

  2. c++:-9

    上节(c++:-8)主要学习了C++的流类库和输入输出,本节学习C++的异常处理. 异常处理 介绍 (1)异常处理的基本思想: (2)异常处理的语法: (3)举例:处理除0异常 #include &l ...

  3. webpack基础知识介绍

    1.开发模式 开发模式顾名思义就是我们开发代码时使用的模式 webpack默认只处理js文件,对样式是没办法处理的.因此要处理css资源需要引入CSS-loader 处理CSS资源 如果要使用 css ...

  4. python基础数据类型1

    python基础数据类型1 part1: ''' ''': 三个单引号用于换行的字符串 字符串可以相加(拼接)相乘(重复) 在Python中没有一个专门的语法代表常量,程序员约定俗成用变量名全部大写代 ...

  5. JetBrains IDE全新UI预览版来了,要做简洁与强大兼顾的IDE

    5月23日,JetBrains发布了一篇博文,透露他们正在实现一套全新的界面界面. 他们认为目前行业中的用户界面趋势已经发生了演变,很多新用户认为JetBrains IDE的界面过于笨重,而且过时.所 ...

  6. Myers差分算法的理解、实现、可视化

    作者:Oto_G QQ: 421739728 目录 简介 基础 差异的描述 好的差异比较 算法介绍 名词解释 两个定理 绘制编辑图 感谢 简介 本文章对Myers差分算法(Myers Diff Alg ...

  7. WIN32 API 获取文件版本信息

    CString strVersion; CString strPath(_T("xxxxxxxx.exe")); // 读文件信息 DWORD dwVerHnd = 0; DWOR ...

  8. Base64编码知识详解

    在我们进行前端开发时,针对项目优化,常会提到一条:针对较小图片,合理使用Base64字符串替换内嵌,可以减少页面http请求. 并且还会特别强调下,必须是小图片,大小不要超过多少KB,等等. 那么,B ...

  9. vue大型电商项目尚品汇(后台篇)day03

    今天把平台属性的管理基本完成了,后台管理做到现在基本也开始熟悉,确实就是对ElementUI的一个熟练程度. 一.平台属性管理 1.动态展示数据 先把接口弄好,应该在第三级标题选择后进行发请求 静态页 ...

  10. call apply bind的作用及区别? 应用场景?

    call.apply.bind方法的作用和区别: 这三个方法的作用都是改变函数的执行上下文,换句话说就是改变函数体内部的this指向,以此来扩充函数依赖的作用域 1.call 作用:用于改变方法内部的 ...