9 JavaScript闭包

这篇具有很好参考价值的文章主要介绍了9 JavaScript闭包。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

9 闭包

我们都知道,函数里是可以访问函数外的全局变量,而函数外不能访问函数内的局部变量,如下:

// 函数外定义a,在函数内可以访问
var a = "测试";
function fn() {
    console.log(a);
}
fn();

执行结果:
9 JavaScript闭包

// 函数内定义a,在函数外访问不到
function fn() {
    var a = "测试";
}
console.log(a);

执行结果:
9 JavaScript闭包

之所以出现这样的情况,就是因为函数内定义的变量为局部变量,函数外定义的变量为全局变量(不同于windows)。在函数内部可以访问到全局变量,而在函数外部是无法访问到函数内部的局部变量的。
接下来,我们先看一段代码:

let name = "水木年华";
function fn() {
    name = "张杰";
}
fn();
console.log(name);	// 张杰

由此可知,在函数内部想要修改外部的变量是十分容易的一件事. 尤其是全局变量. 这是非常危险的. 试想, 我写了一个函数. 要用到name, 结果被别人写的某个函数给修改掉了. 多难受.
接下来,我们来看一个例子:
比如目前有一个项目,需要两个人一起开发,分别是小明.js和小芳.js
小明.js:

var key = '小明的key';
function jiami() {
	console.log("小明使用", key, "来加密");
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="小明.js"></script>
    <script>
        fn();   // 小明使用 小明的key 来加密
    </script>
</head>
<body>
</body>
</html>

小芳.js:

var key = '小芳的key';
function jiami() {
	console.log("小芳使用", key, "来加密");
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="小芳.js"></script>
    <script>
        fn();   // 小芳使用 小芳的key 来加密
    </script>
</head>
<body>
</body>
</html>

两个人的代码在各自执行的时候都没有问题,但是当把两个js文件同时在一个html文件中引用时,就会出现变量值被修改的问题:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="小明.js"></script>
    <script src="小芳.js"></script>
    <script>
	/*两个人都叫jiami,怎样区分调用的是谁的方法?*/
        jiami();
		jiami();
    </script>
</head>
<body>
</body>
</html>

执行结果:
9 JavaScript闭包
很明显,两个脚本在同一个html文件中被引用时,变量名和函数名重复,是不是觉得让各自的变量名和函数名不一致就可以了?如下:
小明.js:

var xiaoming_key = '小明的key';
function xiaoming_jiami() {
	console.log("小明使用", xiaoming_key, "来加密");
}

小芳.js:

var xiaofang_key = '小芳的key';
function xiaofang_jiami() {
	console.log("小芳使用", xiaofang_key, "来加密");
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="小明.js"></script>
    <script src="小芳.js"></script>
    <script>
        xiaoming_jiami();
        xiaofang_jiami();
    </script>
</head>
<body>
</body>
</html>

执行结果:
9 JavaScript闭包
这样搞确实可以实现了哈。但是问题来了,这个项目用到的变量和函数少,js脚本也少。而在真正的羡慕中,一个html文件可能引用几十个js文件,每个js文件又有成百上千的变量或者函数,这样的话我在一个一个的去修改变量名和函数名?不太现实,况且在html文件中引用的时候也不方便。那么现在这种情况,我们就可以尝试一下闭包了,比如小明和小芳之前的js代码是在一个函数中的:
小明.js:

function ming() {
	/*
	在外面在套一层函数结构,使key变量和jiami函数的作用范围由之前的全局变为ming函数的局部作用域
	*/
	var key = '小明的key';
	function jiami() {
		console.log("小明使用", key, "来加密");
	}
	return jiami;	// 最后在返回函数名供外部使用
}
ming_jiami = ming();	// 这里的ming_jiami要与小芳的进行区分

小芳.js:

function fang() {
	var key = '小芳的key';
	function jiami() {
		console.log("小芳使用", key, "来加密");
	}
	return jiami;
}
fang_jiami = fang();	// 小芳这里的fang_jiami也要与小明区分
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="小明.js"></script>
    <script src="小芳.js"></script>
    <script>
        ming_jiami();    // 小明
        fang_jiami();    // 小芳
    </script>
</head>
<body>
</body>
</html>

执行结果:
9 JavaScript闭包
现在执行结果确实没有问题了,两个人的脚本都可以正常使用了。但是两个人外层的函数还是有可能是一样的,我们再用之前学过的匿名函数再优化一下:
小明.js:

ming_jiami = (function(){
	var key = '小明的key';
	function jiami() {
		console.log("小芳使用", key, "来加密");
	}
	return jiami;
})();

小芳.js:

fang_jiami = (function () {
	var key = '小芳的key';
	function jiami() {
		console.log("小芳使用", key, "来加密");
	}
	return jiami;
})();
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="小明.js"></script>
    <script src="小芳.js"></script>
    <script>
        ming_jiami();    // 小明
        fang_jiami();    // 小芳
    </script>
</head>
<body>
</body>
</html>

执行结果:
9 JavaScript闭包
OK,至此,就完美的优化了这个代码。在最外面接收内部返回的参数的变量两个人重复的的几率就已经非常低了。何为闭包? 上面这个就是闭包。相信你百度一下就会知道,什么内层函数使用外层函数变量。什么让一个变量常驻内存,等等。其实你细看,它之所以称之为闭包~,它是一个封闭的环境,在内部,自己和自己玩儿,避免了对该模块内部的冲击和改动,避免的变量之间的冲突问题。

闭包的特点:

  • 内层函数对外层函数变量的使用
  • 会让变量常驻与内存

这俩玩意就不解释了,和python的闭包是一个意思。不懂没关系,能看懂他的执行过程就好。文章来源地址https://www.toymoban.com/news/detail-661965.html

到了这里,关于9 JavaScript闭包的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用百度地图官方WEB API,提示APP服务被禁用了,可以访问 http://lbsyun.baidu.com/apiconsole/key# 查看自己的应用具体详情,或联系我们了解详情

    使用百度地图官方WEB API,显示APP服务被禁用了,可以访问 http://lbsyun.baidu.com/apiconsole/key# 查看自己的应用具体详情,或联系我们了解详情 笔者使用百度地图官方WEBDemo下载至本地进行测试,换上笔者的ak,运行代码游览器弹窗显示 相关代码 步骤1、重新创建应用,应用类型选择

    2024年02月12日
    浏览(86)
  • JavaScript 的 闭包

    在 JavaScript 中,闭包是一种强大的特性,它允许函数在结束执行后,仍能访问并控制其外部的局部变量。这种特性在许多高级 JavaScript 编程场景中都发挥着关键作用,如创建函数工厂、实现数据隐藏和封装等。 JavaScript 的变量作用域 在 JavaScript 中,变量的作用域可以是全局的

    2024年02月06日
    浏览(27)
  • 9 JavaScript闭包

    9 闭包 我们都知道,函数里是可以访问函数外的全局变量,而函数外不能访问函数内的局部变量,如下: 执行结果: 执行结果: 之所以出现这样的情况,就是因为函数内定义的变量为局部变量,函数外定义的变量为全局变量(不同于windows)。在函数内部可以访问到全局变量,

    2024年02月12日
    浏览(31)
  • JavaScript闭包详细介绍

    闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见方式是让一个内嵌函数访问其外部(父级)函数的变量,即使外部函数已经执行完毕,其变量仍然存在于内存中。闭包的主要特点是它可以“记住”外部函数的变量。 变量持久化: 闭包能够保持对外部作

    2024年02月20日
    浏览(21)
  • JavaScript 作用域与闭包

    本文内容学习于:后盾人 (houdunren.com) 1.作用域 1)函数被执行后其环境变量将从内存中删除。下面函数在每次执行后将删除函数内部的 total 变量。  function count() {         let total = 0; } count (); 2)函数每次调用都会创建一个新作用域 3)如果子函数被使用时父级环境将被保留

    2024年02月14日
    浏览(24)
  • JavaScript高级:闭包与作用域

    在 JavaScript 的世界里,闭包是一个令人着迷且神秘的概念,它为我们提供了一种强大的能力,能够在函数内部捕获并保留外部作用域的变量。本文将详细解释闭包的概念与应用,带你揭开 JavaScript 的神秘面纱,通俗易懂地理解闭包的奥秘。 1. 作用域与闭包的关系 作用域是指

    2024年02月13日
    浏览(28)
  • JavaScript闭包漏洞与修补措施

    请先看下面一段代码 可以看出,这是一段很典型的js闭包代码,可以通过obj调用get方法传一个参数,如果传的是a就可以得到闭包内的对象sonObj.a 如下,正确的获取到了sonObj的属性a 这是一个典型的闭包场景,这样做的目的是为了屏蔽这个obj,不让外边直接访问它,只能读取它的某一个属

    2024年02月10日
    浏览(27)
  • 深入理解JavaScript闭包:从概念到实践

    JavaScript是一门强大且灵活的编程语言,而闭包(Closure)则是JavaScript中一个非常重要且常用的概念。虽然闭包在JavaScript开发中经常被提及,但它的概念和工作原理可能对一些开发者来说仍然有些模糊。本篇博客旨在帮助读者深入理解JavaScript闭包,从概念到实践,让您能够充

    2024年02月16日
    浏览(33)
  • 【面试高频】JavaScript作用域、闭包、变量提升

    目录 前言 一、作用域 1. 局部作用域 2. 全局作用域 二、作用域链 三、闭包 1. 闭包是什么 2. 闭包的运用 JavaScript 中的作用域、闭包和变量提升是 JavaScript 中的重要概念,也是面试高频考点。 作用域规定了变量的可见性和生命周期,闭包通过捕获自由变量的方式延长了变量的

    2024年02月12日
    浏览(23)
  • 关于GPT4,我们都知道什么?

    人工智能原理与实践 全面涵盖人工智能和数据科学各个重要体系经典 北大出版社,人工智能原理与实践 人工智能和数据科学从入门到精通 详解机器学习深度学习算法原理 我们生活在一个AI激动人心的时代,你会不停看到各种新型模型的推出,它们彻底改变了 AI 领域。2022

    2023年04月16日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包