Javascript学习笔记3 函数表达式 闭包

AR Tag 与 ROS:从基础部署到机器人视觉定位实战 本文详细介绍了AR Tag技术在ROS环境下的部署与应用,涵盖从基础原理到机器人视觉定位的实战技巧。通过分析AR Tag的特征提取、位姿解算等核心技术,结合ROS工具包`ar_track_alvar`的配置优化,帮助开发者实现高精度的视觉定位系统。文章还分享了深度相机配置、坐标转换及性能优化等实用经验,适用于仓储机器人、物流分拣等场景。 阅读详情

函数声明提升:执行代码之前会先读取函数声明(但是使用函数表达式命名定义函数时,使用前必须赋值)

sayhi();     //错误,函数还未赋值
var sayhi = function(){
    alert("hi");
};

闭包

是指有权访问另一个函数作用域中的变量的函数

当创建函数时,会创建一个预先包含全局变量对象的作用域链。作用域链本质上是一个指向变量对象的指针列表,它只引用但不实际包含变量对象,这个作用域链被保存在内部的Scope属性中。
全局环境的变量对象始终存在,而像函数这样的局部环境的变量对象,则只会在函数执行过程中存在。
当调用函数时,会为函数创建一个执行环境,通过复制函数的Scope属性,构建起执行环境的作用域链,接着创建活动变量对象并推入执行环境作用域链的前端。
function makeFunc() {
    var name = "Mozilla";
    function displayName() {   //内部函数
        alert(name);
    }
    return displayName;
}
在另一个函数的内部定义的函数会将外部函数的活动对象添加到它的作用域链中。即使外部函数执行完毕,其也只会销毁外部函数的作用域链,而不会销毁外部函数的变量对象,因为其变量对象仍然被内部函数引用。只有当内部函数也被销毁时,外部函数的变量对象才会被销毁。
因此内部函数可以访问到外部函数中的变量,这就形成了闭包
var myFunc = makeFunc();   //调用外部函数,返回内部函数
myFunc();   //"Mozilla"  虽然外部函数已经执行完毕,但仍然可以访问到外部函数中定义的变量

闭包只能取得外部函数中任何变量的最后一个值(最终值)

function createFunctions(){
    var result = new Array();

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

    return result;
}
  • 上述返回一个数组,数组的每一项都是一个函数,调用每个函数,似乎应该返回自己的索引值,但其实每个函数返回值都是10。因为当外部函数执行完毕后,其变量对象中的 i 已经变为了10,从而此时闭包访问的 i 值是10
function createFunctions(){
    var result = new Array();

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

    return result;
}
  • 上述代码,并没有把闭包直接赋予给数组,而是定义了一个匿名函数,立即执行该函数,将结果传入数组,由于参数都是按值传递的,因此最后每个函数都会返回对应的索引值

关于this对象

匿名函数的执行环境具有全局性,其this对象通常指向window,但由于闭包,可以会不太明显

var name = "The Window";

var object = {
    name : "My object",

    getName : function(){
        return function(){
            return this.name;
        };
    };
};

alert(object.getNameFunc()());   //"The Window" 
  • 每个函数在被调用时都会自动取得两个特殊变量:this和arguments。内部函数在搜索这两个变量时,只会搜索到其活动对象为止。由于匿名函数执行环境具有全局性,因此永远也不会直接访问到外部函数中的变量。
var name = "The Window";

var object = {
    name : "My object",

    getName : function(){
        var that = this;
        return function(){
            return that.name;
        };
    };
};

alert(object.getNameFunc()());   //"My object" 
  • 上述在定义匿名函数之前,将this对象复制给that,然后在闭包中访问该变量

模仿块级作用域

块级作用域(私有作用域)保证在运行结束后,其中定义的变量将会被销魂,避免内存泄漏和全局作用域中过多的变量

(function(){
    //这里是块级作用域
})();

私有变量

任何在函数中定义的变量,包括函数的参数、局部变量和在函数内部定义的其他函数叫做私有变量。利用闭包可以访问到这些私有变量
在构造函数中定义私有变量

function Person(name){
    this.getName = function(){
        return name;
    };

    this.setName = function(value){
        name = value;
    };
}

var person = new Person("zjw");
alert(person.getName());  //"zjw"
person.setName("wjz");
alert(person.getName());  //"wjz"
  • 私有变量name只能通过这两个方法访问

静态私有变量

在私有作用域中定义私有变量和函数,与构造函数中定义特权方法的主要区别在于,私有变量和函数是由实例共享的

(function(){
    var name= "";  //私有变量

    Person = function(value){  //使用函数表达式定义构造函数,函数声明只能创建局部函数
        name = value;          //不使用var关键字,表明全局变量,使外部能够调用该构造函数
    };

    Person.prototype.getName = function(){   //在原型中定义方法,使所有实例共享特权方法
        return name;
    };

    Person.prototype.sayName = function(value){
        name = value;
    };
})();

var person1 = new Person("zjw");
alert(person1.getName());  //"zjw"
person1.setName("wjz");
alert(person1.getName());  //"wjz"

var person2 = new Person("zzz");
alert(person1.getName());  //"zzz"
alert(person2.getName());  //"zzz"
  • 什么时候使用实例变量,还是静态私有变量,取决于具体的需求

模块模式

上述通过构造函数和原型中定义的特权方法都是针对所有实例的,而对单个对象创建私有变量和特权方法则使用模块模式

var singleton = function(){
    var privateVariable = 10;   //定义私有变量

    function privateFunction(){  //定义私有函数
        return false;
    }

    return {                  //返回对象
        publicProperty:20,   //公有属性

        publicMethod:function(){    //特权方法
                privateVariable++;
                return privateFunction();
            }
        }
}();

增强的模块模式(适合那些单例对象必须是某种类型的实例,还必须添加某些属性和方法的情况)

var singleton = function(){
    var privateVariable = 10;   //定义私有变量

    function privateFunction(){  //定义私有函数
        return false;
    }

    var object = new customDefineType();  //创建对象

    object.publicProperty = true;    //公有属性

    object.publicMethod = function(){    //特权方法
        privateVariable++;
        return privateFunction();
    };

    return object; //返回这个对象

}();
如何用SPSS做logistic回归 详细到只有作者本人能看懂的SPSS逻辑回归育儿经 阅读详情

相关推荐

从工业夹爪到Shadow Hand:一文看懂机器人灵巧手的硬件进化史(附避坑指南)

本文详细解析了机器人灵巧手从工业夹爪到Shadow Hand的硬件进化历程,涵盖刚性夹持器、自适应夹持器到多指灵巧手的技术突破。文章还提供了选购指南与技术避坑策略,帮助读者根据操作复杂度和环境结构化程度选择最适合的解决方案,适用于制造业、医疗和服务业等多个领域。

weixin_29074409的博客 484

var遍历输出问题

在前端面试中,var是经典考点,主要考察对的理解。以下代码的输出是什么?333(每个都输出相同的值)。

m0_53450739的博客 727

OpenHarmony v4.1 Release设置应用随系统自动启动

OpenHarmony 4.1 版本中的 Ability Manager Service (AMS) 提供了应用自启动管理功能,允许系统控制哪些应用可以在系统启动时自动运行。这需要以下两个主要步骤:启用系统的自启动管理支持开发一个系统应用来管理自启动配置。

afufufufu的博客 1899

函数表达式 及 闭包

函数表达式 函数又两种定义方式: ①.函数声明 它有个特性叫 函数声明提升.可以把这个声明放到最后面,前面调用不会报错. var ret = abc(); function abc(){return "abc";} ②.就是本页重点说的 函数表达式 它不具有所谓的"提升",所以一定先定义好,再在下面调用才...

weixin_30955341的博客 101

ADS高级技巧:用DAC控件实现多变量参数扫描(以S参数和阻抗匹配为例)

本文深入解析了ADS软件中DAC控件的高级应用,指导用户如何利用其实现多变量参数扫描。通过构建支持多变量的MDF文件,并将其与原理图变量动态映射,可以高效完成如S参数和阻抗匹配等复杂场景的联合仿真与可视化分析,显著提升射频电路设计的效率和深度。

3a9bq4r8t2y的博客 253

亚马逊广告接口 amazon advertising

亚马逊广告接口官方说明:https://advertising.amazon.com/API/docs/en-us/setting-up/account-setup 一:注册aws开发者账号 注册地址:https://developer.amazon.com 二:填写注册资料 三:进入控制台,生成安全配置文件 进入 Login with Amazon 菜单: 创建配置文件: 四:申请广告接入权限 申请地址:https://advertising.amazon.com/zh-cn/about-api

lzy66666的博客 4776

闭包允许内层函数引用父函数中的变量,但是该变量是最终值,而不是变化的...

今天做东西的时候遇到的问题 [code="javascript"]for(var k=0; k

程序员聊聊 468

从零开始:用ADS 2023手把手教你设计2.4GHz Wi-Fi LNA(基于ATF-54143,附模型文件)

本文详细介绍了如何使用ADS 2023软件设计2.4GHz Wi-Fi频段的低噪声放大器(LNA),基于ATF-54143晶体管。内容涵盖模型导入、直流工作点确定、稳定性优化、噪声匹配等关键步骤,并提供可下载的模型文件包,帮助工程师快速掌握LNA设计技巧。

weixin_42531128的博客 320

闭包中始终为最终值

闭包允许内层函数引用父函数中的变量,但是该变量是最终值 示例六: /** * * * one * two * three * one * */ var lists = document.getElementsByTagName('li'); for(var i = 0 , len = lists.length ; i < len

shaleilei的博客 288

大数据分析利器:Tableau实战教程从入门到精通

你有3家分店,每月收集1000条销售数据(日期、分店、口味、销售额、订单数);想用Excel分析“哪家分店最赚钱”,但要做透视表→改格式→画柱状图,耗时30分钟,还经常因为公式错误返工;想看看“草莓味奶茶的月度销量趋势”,得手动筛选数据、调整折线图轴范围,稍不注意就漏看关键节点;想把分析结果分享给合伙人,Excel表格太抽象,对方盯着数字问“你到底想告诉我什么?

AI架构师小马 1491

【AutoSAR CAN】04 - 如何使用Davinci Configurator Pro工具配置CAN的波特率

改参数为Tx Arbitration start delay value ,可用于延迟仲裁过程的起始点,用来补偿CAN收发器及线路的传输延迟,以优化传输性能。有关详细信息,请参阅硬件手册。该参数指定采样点模式,即选择多少个采样点的数量,如果选择了每比特三个样本选项,则该点标记第三个样本的位置;我们要配置CAN的波特率,其实就是要弄明白 CAN 控制器的位时序即可,具体的理论部分和EB的配置部门可参考文章《该参数表示传播延迟有多少个时间单位Tq,即上文中的Propagation delay/PROGSEG。.

2601

javaScript高级程序设计----笔记第七到九章

函数表达式 函数表达式的特征 使用函数实现递归 使用闭包定义私有变量 函数表达式特征 函数声明提升 执行代码之前会先读取函数声明。这就意味着可以把函数声明放在调用它的语句后面。 sayHi(); function sayHi(){ alert("Hi!"); } 匿名函数 var functionName = function(arg0, arg1, arg2){ ...

qq_41056944的博客 277

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【JavaScript】函数:闭包、立即调用的函数表达式、eval命令

闭包就是函数f2,即能够读取其他函数内部变量的函数。由于在JavaScript语言中,只有函数内部的子函数才能读取内部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。闭包最大的特点,就是它可以“记住”诞生的环境,比如f2记住了它诞生的环境f1,所以从f2可以得到f1的内部变量。只要闭包没有被垃圾回收机制清除,外层函数提供的运行环境也不会被清除,它的内部变量就始终保存着当前值,供闭包读取。注意,外层函数每次运行,都会生成一个新的闭包,而这个闭包又会保留外层函数的内部变量,所以内存消耗很大。

weixin_45980065的博客 1828

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

JS中立即执行函数和闭包的区别

函数声明 规则:必须指定一个函数名字 foo(); function foo() { console.log("函数声明") } 由于函数声明会被提升,所以调用函数可以在之前或之后调用 函数表达式 规则:将函数赋值给一个变量 var foo = function () { console.log("函数表达式") } foo() 由于函数表达式,只会对变量foo进行提升...

刘运召的博客 6827

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

前端JavaScript篇之对闭包的理解

闭包是指一个函数能够访问并操作其词法作用域(定义时所在的作用域)之外的变量的能力。它可以通过在一个函数内部创建另一个函数来实现。内部函数可以访问外部函数的局部变量、参数和其他内部函数,即使外部函数已经执行结束,这些变量仍然可以被内部函数引用。

星辰迷上大海的博客 2231

JS函数表达式与闭包

在JavaScript编程中,函数表达式是一种非常有用的技术。使用函数表达式可以无需对函数命名,从而实现动态编程。匿名函数,也成为拉姆达函数,是一种使用JavaScript函数的强大方式。以下总结了函数表达式的特点 函数表达式不同于函数声明。函数声明要求有名字。但函数表达式不需要。没有名字的函数表达式也叫做医名函数。 在无法确定如何引用函数的情况下,递归函数就会变得比较复杂 递归函数应该始终使用...

qq_39188577的博客 229

JS中的函数表达式

1. 函数表达式的特征 2. 使用函数实现递归 3. 使用闭包定义私有变量

WINMI 4018

函数表达式:JavaScript中那些你不知道的优雅写法

在 JavaScript 的世界里,函数是一等公民,这意味着函数可以像变量一样被传递、赋值、作为参数传递给其他函数,甚至可以作为函数的返回值。而函数表达式正是这种灵活性的体现之一。今天,我们就来深入探讨一下《JavaScript 高级程序设计》第七章中关于函数表达式的那些优雅写法。

wenyang12的博客 1722

JS-函数表达式(闭包、匿名函数)

一句话概括: 闭包就是有权利使用另一个函数作用域的变量的函数。 匿名函数就是创建了一个函数并将其赋给一个变量的函数。 ##### 定义函数的方式有两种:一种是函数声明,另一种就是函数表达式。 函数声明的语法是这样的。 function functionName(arg0, arg1, arg2) { // 函数体 } 关于函数声明,它的一个重要特征就是...

Iris54Iris的博客 469

【JavaScript】函数表达式&闭包

JS中的函数表达式和闭包都是极其有用的特性,利用它们可以实现很多功能。不过,因为创建闭包必须维护额外的作用域,所以过度使用它们可能会占用大量内存。

StarkerRegen的博客 287

「JavaScript深入」彻底理解JS中的闭包

彻底理解JS的闭包问题:概念、示例、实用的闭包、用闭包模拟私有方法、一个常见错误:在循环中创建闭包、优劣、图解闭包、闭包在实际中的应用

XH_jing的博客 1895

每日三问之javascript函数表达式之递归、闭包、私有变量

递归

君子不器 335

js函数表达式, 闭包, 作用域链 的理解

1定义函数表达式有两种方式: 函数声明和函数表达式. 函数声明如下: function functionName(arg0,arg1,arg2){ //函数体 } 首先是function关键字,然后是函数的名字. FF,Safrai,Chrome和Opera都给函数定义了一个非标准的name属性,通过这个属性可以访问到函数指定的名字.这个函数的值永远等于跟在function关键字后面的...

weixin_42048805的博客 212

(javascript)浅析js函数表达式和函数声明以及闭包

1.函数 定义函数的方法有两种,一种是函数声明,另一种是函数表达式. //函数声明 function f1(){}//函数表达式 var f1=function(){}这两者的区别在于:函数声明会在所有代码执行前进行解析,而函数表达式和声明变量一样都是执行到这里的时候才进行解析。(看例子) f1() var f1=function(){ console.log(1) } Uncaught

minixu的博客 2799

什么是闭包为什么它在JavaScript中很有用

闭包的基本概念闭包的作用代码示例示例一:简单的闭包示例示例二:使用闭包模拟私有变量示例三:闭包与事件监听器示例四:闭包与立即执行函数表达式(IIFE)示例五:使用闭包进行记忆化实际工作中的技巧。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1427

函数表达式和闭包

一、介绍 本次博客主要介绍函数表达式的内容,主要是闭包。 二、函数表达式 定义函数的两种方式:一个是函数声明,另一个就是函数表达式。 //1.函数声明写法 function fn2(){ console.log('函数声明'); } //2.函数表达式写法 var fn1 = function(){ console.log('函...

anxiubei7556的博客 153
上一篇: Javascript学习笔记2 继承 原型链
下一篇: 冒泡排序
PAT-python-zjw
博客等级 码龄10年 381粉丝 408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值