JavaScript进阶学习笔记(四)--- 函数和闭包

news/2024/7/19 13:09:57 标签: javascript, js

一、函数的定义

1、function 关键字

js">function fn(){}

2、函数表达式(匿名函数)

js">var fn = function(){}

3、new Function()

js">var f = new Function('a', 'b', 'console.log(a + b)');
f(1, 2);

var fn = new Function('参数1','参数2'..., '函数体')
注意
/*Function 里面参数都必须是字符串格式
这种方式执行效率低,也不方便书写,因此较少使用
所有函数都是 Function 的实例(对象)  
函数也属于对象
*/

二、函数的调用

js">/* 1. 普通函数 */
function fn() {
	console.log('人生的巅峰');
}
 fn(); 
/* 2. 对象的方法 */
var o = {
  sayHi: function() {
  	console.log('人生的巅峰');
  }
}
o.sayHi();
/* 3. 构造函数*/
function Star() {};
new Star();
/* 4. 绑定事件函数*/
 btn.onclick = function() {};   // 点击了按钮就可以调用这个函数
/* 5. 定时器函数*/
setInterval(function() {}, 1000);  // 这个函数是定时器自动1秒钟调用一次
/* 6. 立即执行函数(自调用函数)*/
(function() {
	console.log('人生的巅峰');
})();

三、函数内部的this指向问题

​ 不同类型的函数,内部的this指向是不同的,而且调用方式的不同决定了this指向的不同,但一般来说this是指向函数的调用者。

在这里插入图片描述

四、改变this的指向

1、call()

​ 使用 函数.call(对象,参数1,参数2…) 的方法来调用一个函数,可以改变函数的this指向,让函数的this指向参数里的那个对象。还可以通过该方法实现继承。

js">// 案例代码

var o = {
	name: 'andy'
}
 function fn(a, b) {
      console.log(this);
      console.log(a+b)
};
fn(1,2)// 此时的this指向的是window 运行结果为3
fn.call(o,1,2)// 此时的this指向的是对象o,参数使用逗号隔开,运行结果为3

2、apply()

​ 使用 函数.apply(对象,[参数1,参数2…]) 的形式来调用一个函数,也可以改变函数的this指向,但此时参数必须以数组的形式传递。可以结合数学内置对象来实现获取数字数组的最大最小值。

js">// 案例代码

var o = {
	name: 'andy'
}
 function fn(a, b) {
      console.log(this);
      console.log(a+b)
};
fn()// 此时的this指向的是window 运行结果为3
fn.apply(o,[1,2])//此时的this指向的是对象o,参数使用数组传递 运行结果为3

// 结合数学内置对象实现求数字数组的最大值
var arr = [1,66,3,99,4]
var max = Math.max.apply(Math,arr) 

3、bind()

​ 函数bind(对象,参数1,参数2…)方法可以能只改变函数的this指向,而不调用这个方法,并有返回值,是原函数改变this后产生的新函数。

js">// 案例代码

 var o = {
 name: 'andy'
 };

function fn(a, b) {
	console.log(this);
	console.log(a + b);
};
var f = fn.bind(o, 1, 2); //此处的f是bind返回的新函数
f();//调用新函数  this指向的是对象o 参数使用逗号隔开

4、call()、apply()、bind()的异同

共同点:

​ 都可以改变函数内部的this指向。

不同点:

​ ① call 和 apply 在改变函数内部this指向的同时,会调用函数。而bind 不调用函数,只改变函数的this指向。

​ ② call 和 bind 传递的参数都是用逗号隔开的独立参数,而apply是以数组的形式来传递参数。

​ ③ 应用场景:call 经常来实现继承,apply 经常是来操作数组、bind用来不调用函数,只改变函数this指向。

五、高阶函数

​ 所谓的高阶函数 就是指一个函数的内部对其他函数进行操作,接受函数作为参数或者将函数作为返回值,此时该函数就是一个高阶函数。

在这里插入图片描述

六、闭包(了解)

​ 闭包(closure)是指有权访问另一个函数作用域中变量的函数,简单来说就是,一个作用域可以访问另一个函数作用域的局部变量。闭包让你可以在一个内层函数中访问到其外层函数的作用域。在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。
我理解的闭包就是"定义在一个函数内部的函数"。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

​ 闭包的主要作用就是:延伸函数局部变量的作用范围。

  function f1(){

    var n=999;

    function f2(){
      alert(n);
    }

    return f2;

  }

  var result=f1();

  result(); // 999
js">// 案例代码

// 1.利用闭包的方式得到当前li 的索引号
for (var i = 0; i < lis.length; i++) {
// 利用for循环创建了4个立即执行函数
// 立即执行函数也成为小闭包因为立即执行函数里面的任何一个函数都可以使用它的i这变量
(function(i) {
    lis[i].onclick = function() {
      console.log(i);
    }
 })(i);
}

// 2.闭包应用-3秒钟之后,打印所有li元素的内容
 for (var i = 0; i < lis.length; i++) {
   (function(i) {
     setTimeout(function() {
     console.log(lis[i].innerHTML);
     }, 3000)
   })(i);
}

详细内容请参考 http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html


http://www.niftyadmin.cn/n/803657.html

相关文章

JavaScript进阶学习笔记(五)--- 严格模式

一、严格模式 1、严格模式的概念 ​ JavaScript 除了提供正常模式外&#xff0c;还提供了严格模式&#xff08;strict mode&#xff09;。ES5 新增的严格模式是采用具有限制性 JavaScript变体的一种方式&#xff0c;即在严格的条件下运行 JS 代码。格模式在 IE10 以上版本的浏…

激光推送

1&#xff0c;首先需要将你的app在极光官网上进行注册&#xff0c;获取一个ApiKey&#xff0c;一个APIMasterSecret&#xff08;密码&#xff09;&#xff0c;将这两个值保存在配置文件&#xff08;app/web.config&#xff09;中&#xff0c;具体手机开发端需要做什么操作我们.…

JavaScript进阶学习笔记(六)--- 正则表达式

一、正则表达式 1、正则表达式概述 ​ 正则表达式&#xff08; Regular Expression &#xff09;是一种用于匹配字符串中字符组成的模式&#xff0c;用来检测某个字符串的组成是否符合某种要求或规则&#xff0c;通常用来验证表单&#xff1a;例如验证用户名只能由英文字母、…

配置Tomcat虚拟路径

Tomcat虚拟路径&#xff1a;作用类似于访问某个设定的路径时&#xff0c;根据虚拟路径的配置去访问一个绝对路径下的项目 1.E盘根目录下创建demo文件夹(E:\demo)。复制Tomcat目录下的webapps\ROOT中的WEB-INFO文件夹到demo文件夹。 (里面带有一个web.xml文件) 2.在tomcat\conf下…

JavaScript进阶学习笔记(七)--- ES6相关

一、ES6的概念 ​ ES 的全称是 ECMAScript &#xff0c;6 是指 版本 &#xff0c;是由 ECMA 国际标准化组织制定的一项脚本语言的标准化规范。ES6 的出现修改了 JavaScript 一些不足之处&#xff0c;使其更加完善。 二、ES6新增语法 1、let ​ ES6 中新增了 let 关键字用来…

AngularJS 学习笔记(一)--- 表达式和指令

注&#xff1a;最近实习的公司接手了一个17年的项目用到了 AngularJS &#xff0c;让我去做一些东西&#xff0c;我想既然用到了 那我就整理一下学习笔记吧&#xff0c;也算留个印象。但肯定比较粗糙&#xff0c;只是说怎么用&#xff0c;而不去深入探究原理机制 一、AngularJ…

thinkerCMS是一款thinkphp写的微型cms框架可以参考下

http://www.thinkphp.cn/code/1764.html thinkphp官网thinkercms介绍 http://cms.thinkerphp.com/下载地址 转载于:https://www.cnblogs.com/gzyx1988/p/5284096.html

AngularJS 学习笔记(二)--- 模块、控制器和过滤器

一、模块 Module 1、概念 ​ 模块定义了一个应用程序&#xff0c;是控制器的容器&#xff0c;模块的范围限制了 应用程序的作用范围。模块是配置代码块和运行代码块的集合&#xff0c;在启动阶段被执行。通过 angular.module 来创建模块。 ​ 模块创建时可以列出 他所依赖的…