JavaScript 函数(作用域以及闭包)

JavaScript 函数(作用域以及闭包)

 

・执行环境及作用域

 

 执行环境定义了变量或函数有权访问的其他数据。

  每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量或函数都保存在这个对象中,

  虽然我们编写的代码无法访问这个对象,但解析器在处理数据时会在后台使用它。

 

  当代码在一个环境中执行时,会创建变量对象的一个作用域链。

  作用域链的作用是保证对执行环境有权访问的所有变量和函数的有序访问;

  作用域的前端始终是当前执行的代码所在环境的变量对象。

 

・函数表达式

 

  定义函数的两种方式: 函数声明和函数表达式

 

  函数声明的重要特征是函数声明提升,及在执行代码之前会先读取函数声明。

  sayHi();

  function sayHi() {

        ......

  }

 

・闭包

  概念: 有权访问另一函数作用域中的变量的函数。

 

function(value1, value2) {if(value1 < value2) {return -1;} else if(value1 > value2) {return 1;} else {return 0;}
}var result = compare(5, 10);

 

 

  闭包会携带包含它的函数的作用域,因此会比其他函数占用更多的内存。

 

  另一个副作用: 闭包只能取得包含函数中任何变量的最后一个值。因为闭包所保存的是整个变量对象,而不是某个特殊的变量。

 

function createFunctions() {var result = new Array();for(var i=0; i<10; i++) {result[i] = function() {return i;};}return result;
}

  返回的函数数组中的每个函数的返回值都为10。

  解决方案

 

function createFunctions() {var result = new Array();for(var i=0; i<10; i++) {result[i] = (function(num) {return function() {return alert(num);};})(i);}return result;
}

 

・this对象

  全局函数中,this等于window;

  函数被作为某个对象的方法调用时,this等于那个对象;

  匿名函数的执行环境具有全局性,this通常指向window。

 

var name = "The Window";var object = {name: "My Object",getNameFunc: function() {return function() {this.name;};}
};alert(object.getNameFunc()());// 执行结果: The Window

  第一步 object.getNameFunc()作为函数方法调用,this指向的是object;

  第二步 object.getNameFunc()()作为匿名函数调用,this指向的是window;

 

转载于:https://www.cnblogs.com/dreamerjdw/p/6233534.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429735.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《DSP using MATLAB》第6章开始了

看到第6章了&#xff0c;标记一下&#xff0c;全书近一半&#xff0c;继续加油 构建滤波器的三种元件&#xff1a; 下面是函数floor和size的部分帮助截图 转载于:https://www.cnblogs.com/ky027wh-sx/p/6235509.html

codeql php,使用codeql 挖掘 ofcms

前言网上关于codeql的文章并不多&#xff0c;国内现在对codeql的研究相对比较少&#xff0c;可能是因为codeql暂时没有中文文档&#xff0c;资料也相对较少&#xff0c;需要比较好的英语功底&#xff0c;但是我认为在随着代码量越来越多&#xff0c;传统的自动化漏洞挖掘工具的…

php 连接符.,PHP怎么在数字之间添加连接符

PHP实现数字之间添加连接符&#xff0c;我们可以通过PHP中的for循环思想来实现。这里的连接符指的是“-”符号。推荐参考&#xff1a;《PHP教程》那么对于新手来说&#xff0c;可能有一定难度。下面我们就通过简单的代码示例&#xff0c;给大家介绍PHP给数字之间添加连字符的实…

嵌入式linux 时间同步,解决嵌入式Linux中的时区问题

如果说让我做上层软件的工作&#xff0c;我做起来可以得心应手&#xff0c;但是让我做平台方面的工作(系统问题解决、驱动编写、软件移植等工作)&#xff0c;确实不熟悉。所以很多问题都是摸着石头过河&#xff0c;没有经验。许多问题在有经验的朋友那里是小菜一碟&#xff0c;…

bzoj2243

2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6753 Solved: 2496[Submit][Status][Discuss]Description 给定一棵有n个节点的无根树和m个操作&#xff0c;操作有2类&#xff1a; 1、将节点a到节点b路径上所有点都染成颜色c&#xff1b; 2、询问节点…

eclipse linux windows 乱码,Ubuntu下Eclipse打开Windows下的工程文件乱码解决办法

Eclipse在Windows下默认使用的是GBK(包括GB2312)编码&#xff0c;而在Linux系统默认使用的是UTF-8编码&#xff0c;并且eclipse编码设置下拉列表不提供GBK编码可选项。如果eclipse打开工程或者文本乱码&#xff0c;基本可以肯定(因为常用的就这两种)这个工程/文本使用的是GBK编…

linux桌面旋转了180度,[多图]回顾每一款默认Ubuntu壁纸

每个默认的Ubuntu壁纸Ubuntu 4.10’Warty Warthog’当人们抱怨Ubuntu发行版中的“ 褐色 ”时&#xff0c;我经常想回到Ubuntu的第一张墙纸&#xff0c;以便他们的意见可以转变为“上下文”。事后看来&#xff0c;这只墙纸完全是一块毫无生气的带有徽标的棕色块。当然&#xff0…

【转】Apache 配置虚拟主机三种方式

Apache 配置虚拟主机三种方式 原文博客http://www.cnblogs.com/hi-bazinga/archive/2012/04/23/2466605.html一、基于IP 1. 假设服务器有个IP地址为192.168.1.10&#xff0c;使用ifconfig在同一个网络接口eth0上绑定3个IP&#xff1a; [rootlocalhost root]# ifconfig eth0:1 1…

linux weblogic 防火墙,本地访问weblogic控制台无反应,关闭linux操作系统防火墙

有时候&#xff0c;我们在Linux操作系统上成功启动了weblogic&#xff0c;也查看了7001端口的状态是开启的。但是访问weblogic控制台没有反应&#xff0c;也没有报错。使用 netstat -ano | grep 7001 查看端口的状态可是访问weblogic控制台&#xff0c;还是没有反应。我们在本地…

fedora linux搜狗输入法,在Fedora 28系统下安装搜狗输入法

以下介绍在Fedora 28系统下安装搜狗输入法&#xff0c;也适用在Fedora 27下的安装&#xff0c;亲测可以。先声明一下&#xff0c;在Fedora 27及以后版本中出现的输入框候选词界面变形但不影响使用。第一步&#xff1a;安装fzug软件源具体方法如下&#xff1a;1.添加 FZUG 源Fed…

linux reboot命 过程,IDRAC安装dell服务器操作系统(linux or windows),用到生命周期管理器...

1、首先给服务器装上idrac模块&#xff0c;然后给idrac配置一个远程IP&#xff0c;用作管理2、在web界面输入IP&#xff0c;弹出以下界面&#xff0c;输入账号密码登录3、认证成功后&#xff0c;点击虚拟控制台启动4、进入如下界面&#xff0c;点击菜单栏的《虚拟介质》&#x…

DroidPlugin插件化开发

360手机助手使用的 DroidPlugin&#xff0c;它是360手机助手团队在Android系统上实现了一种插件机制。它可以在无需安装、修改的情况下运行APK文件,此机制对改进大型APP的架构&#xff0c;实现多团队协作开发具有一定的好处。 它是一种新的插件机制&#xff0c;一种免安装的运行…

io wait linux,另辟蹊径-诊断工具之 IO wait

导读最近在做日志的实时同步&#xff0c;上线之前是做过单份线上日志压力测试的&#xff0c;消息队列和客户端、本机都没问题&#xff0c;但是没想到上了第二份日志之后&#xff0c;问题来了&#xff1a;1、问题&#xff1a;集群中的某台机器 top 看到负载巨高&#xff0c;集群…

Oracle第二天

Oracle第二天 整体安排&#xff08;3天&#xff09; 第一天&#xff1a;Oracle的安装配置&#xff08;服务端和客户端&#xff09;&#xff0c;SQL增强&#xff08;单表查询&#xff09;。 第二天&#xff1a;SQL增强&#xff08;多表查询、子查询、伪列-分页&#xff09;&…

linux搭建虚拟化平台报告,部署KVM虚拟化平台------搭建(示例代码)

一 、部署KVM虚拟化平台hyper-v是windows中的虚拟化1、KVM模块直接整合在Linux内核中&#xff0c;kvm是内核模块&#xff0c;虚拟机与kvm模块之间为管理工具2、KVM组成1.KVM Driver---虚拟机创建---虚拟机内存分配---虚拟CPU寄存器读写---虚拟CPU运行2.QEMU (经过简化与修改)--…

linux 选择文件指定的行数据类型,06练习题

1.如何删除一个非空子目录/tmp&#xff1f; BA. del /tmp/*B. rm -rf /tmpC. rm -Ra /tmp/*D. rm -rf /tmp/*2.存放linux默认系统日志文件是 BA./var/log/dmesg #系统启动时日志B./var/log/messages #系统日志C./var/log/secure #登录相关 安全3.用命令ls -l显示出来文件txt的描…

C#多线程编程

C#多线程编程 一、使用线程的理由 1、可以使用线程将代码同其他代码隔离&#xff0c;提高应用程序的可靠性。 2、可以使用线程来简化编码。 3、可以使用线程来实现并发执行。 二、基本知识 1、进程与线程&#xff1a;进程作为操作系统执行程序的基本单位&#xff0c;拥有应用程…

《DSP using MATLAB 》示例Example6.3

代码&#xff1a; C0 0; B1 [2 4; 3 1]; A1 [1 1 0.9; 1 0.4 -0.4]; B2 [0.5 0.7; 1.5 2.5; 0.8 1]; A2 [1 -1 0.8; 1 0.5 0.5; 1 0 -0.5]; [b1, a1] par2dir(C0, B1, A1)[b2, a2] par2dir(C0, B2, A2)b conv(b1, b2) % Overall direct form numerator a conv(a1…

简单说明c语言程序步骤,C语言的入门简介和三个简单的C语言程序详细说明

学习一种编程语言&#xff0c;最重要的是建立一个练习环境&#xff0c;边学边练才能学好。Keil软件是目前最流行开发80C51系列单片机的软件&#xff0c;Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案&#xff0c;通过一个集成…

java入门,学习笔记

编译 通过javac编译java程序&#xff0c;会编译出一个后缀为class的文件&#xff0c;我们再通过java虚拟机&#xff08;jvm&#xff09;执行编译后的java程序。 在java中始终有一个main函数&#xff0c;它作为程序的入口&#xff0c;程序从这个入口开始执行一直到结束。 public…