Get Comfortable with Closures

2024-06-12 16:08
文章标签 get comfortable closures

本文主要是介绍Get Comfortable with Closures,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文意译自 高效javascript 之本文标题,其言简意骇。

理解javascript闭包 ,仅需要认清三个必要事实

事实一:javascript 允许引用当前函数外部定义的变量

 示例:

function makeSandwich(){var magicIngredient = "peanut butter";function make(filling){return magicIngredient + " and " + filling;}return make("jelly");
}makeSandwich();

注意:内层函数make 引用了一个定义在外层函数 makeSandwich内的变量 magicIngredient


 事实二: 即使是在外层函数调用结束之后,内层函数仍然能够引用定义在外层函数内的变量!

如此这般:意味着你可以返回一个函数,在未来的某个时候去调用它!!!

function sandwichMaker(){var magicIngredient = "peanut butter";function make(filling){return magicIngredient + " and " + filling;}return make;
}
var f =  sandwichMaker(); f("jelly");

注意:f 值就是内部make函数,且调用f会对调用make生效. 即使sandwichMaker函数已经调用完毕,make函数仍然能够记住外部变量magicIngredient的值。

为什么会这样?

  javascript 函数值所包含的信息 不止于在函数被调用执行时所需要的代码。它会内部存储,函数定义时所引用的任意变量。这种保持对来自作用域变量追溯的函数就是众所周知的闭包。make函数是一个闭包,它的代码引用了两个外部变量。无论何时make函数被调用,它的代码都能够引用这两个变量。这是因为它们被存储在闭包内。

js常识:一个函数能引用在它自己作用域内任意变量,包括参数和外层函数变量。


事实三:闭包可以修改外层变量的值

注意:从本质上讲,闭包存储的是外层变量的引用,而不是复制它们的值。如此这般,闭包就拥有修改外部变量的权限。

function box(){var val = undefined;return {set:function(newVal){val=newVal;},get:function(){return val;},type:function(){return typeof val;}};
}
var b = box();
b.type();//"undefined"
b.set(98.6);
b.get();
b.type(); //"number"

上述示例一个包含三个闭包属性的对象,每个闭包都有共享访问val变量,set更改,get,types查看结果。


小结:

1.函数能够引用定义在外层作用域中的变量

2.闭包比创建它的函数生命周期长

3.闭包会内部存储用到的外部变量引用,并且能够读写它存储的变量。


这篇关于Get Comfortable with Closures的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054686

相关文章

10 Source-Get-Post-JsonP 网络请求

划重点 使用vue-resource.js库 进行网络请求操作POST : this.$http.post ( … )GET : this.$http.get ( … ) 小鸡炖蘑菇 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-w

API28_OKgo_get注意事项

1: implementation 'com.lzy.net:okgo:2.1.4' 2:在BaseApplication中onCreate()中初始化initOKgo() private void initOKgo() {//---------这里给出的是示例代码,告诉你可以这么传,实际使用的时候,根据需要传,不需要就不传-------------//HttpHeaders headers

项目一(一) HttpClient中的POST请求和GET请求

HttpClient中的POST请求和GET请求 一、HttpClient简述 HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。HttpClient已经应用在很多的项目中,比如Apache Jakarta上很著名的另外两个开源项目Cactus和HTMLU

apt-get update更新源时,出现“Hash Sum mismatch”问题

转载自:apt-get update更新源时,出现“Hash Sum mismatch”问题 当使用apt-get update更新源时,出现下面“Hash Sum mismatch”的报错,具体如下: root@localhost:~# apt-get update ...... ...... W: Failed to fetch http://us.archive.ubuntu.com/ub

Flutter-使用dio插件请求网络(get ,post,下载文件)

引入库:dio: ^2.1.13可直接运行的代码:包含了post,get 下载文件import 'package:flutter/material.dart';import 'package:dio/dio.dart';void main() {runApp(new MaterialApp(title: 'Container demo',home: new visitNetPage(),)

Flutter-加三方库卡在flutter package get 的解决办法

Windows PUB_HOSTED_URL ===== https://pub.flutter-io.cnFLUTTER_STORAGE_BASE_URL ===== https://storage.flutter-io.cn 增加两个环境变量,然后执行一下 flutter doctor命令。问题完美解决。

【tensorflow 使用错误】tensorflow2.0 过程中出现 Error : Failed to get convolution algorithm

如果在使用 tensorflow 过程中出现 Error : Failed to get convolution algorithm ,这是因为显卡内存被耗尽了。 解决办法: 在代码的开头加入如下两句,动态分配显存 physical_device = tf.config.experimental.list_physical_devices("GPU")tf.config.experiment

_get_gt_mask、cat_mask、_get_other_mask

import torch# 定义获取标签掩码的函数def _get_gt_mask(logits, target):print("原始 logits:\n", logits)print("目标 target:\n", target)# 将 target 拉平为一维张量target = target.reshape(-1)print("拉平后的 target:\n", target)# 创建一个和

C#通过GET/POST方式发送Http请求

介绍http请求的两种方式,get和post方式。并用C#语言实现,如何请求url并获取返回的数据 两者的区别: 参数 Get请求把提交的数据进行简单编码,同时将url的一部分发送到服务器   比如url:Http://127.0.0.1/login.jsp?Name=zhangshi&Age=30&Submit=%cc%E+%BD%BB   所以get请求方式提交的数据存在一定的安全隐患

使用 GET 方法读取表单数据

HelloForm源码: package firstweb;// 导入必需的 java 库import java.io.*;import javax.servlet.*;import javax.servlet.http.*;// 扩展 HttpServlet 类public class HelloForm extends HttpServlet {public void doGet