读书笔记《你不知道的JavaScript上卷》1.3函数作用域和块作用域

保姆级教程:手把手教你用Python逆向分析极验4.0滑块验证码的w参数生成逻辑 本文提供了一份详细的Python逆向工程教程,手把手教你分析极验4.0滑块验证码的w参数生成逻辑。通过HTTP请求分析、JavaScript逆向和加密算法复现,帮助开发者深入理解验证码防护机制,并实现高效的自动化解决方案。教程涵盖AST反混淆、轨迹生成算法和AES加密等核心技术,适合中高级开发者提升逆向工程能力。 阅读详情

函数作用域和块作用域

函数作用域:属于这个函数的全部变量都可以在整个函数的范围内访问(事实上在嵌套的作用域中也可以访问)。


3.1 函数中的作用域

函数可以形成作用域,这个大家都知道的,如下代码:

function foo() {
    var a = 2;
    console.log("函数foo中的a:" + a);//打印 函数foo中的a:2
}
foo();
console.log("函数foo外的a:" + a);//报错 ReferenceError

函数foo里面形成了一个作用域所以它内部定义的变量a,只有它自己能够访问,外部是无法访问的没有找到该变量故报了一个ReferenceError引用错误。

3.2 隐藏内部实现

由于JS中函数就是一个作用域,同时JS中又有作用域链的存在,因此定义全局的变量或函数是很危险的,当项目庞大的时候过多的全局变量(或全局函数)很可能会发生覆盖,从而导致项目难以维护,所以JS可以在函数中定义另一个函数当某个函数只会在这个函数的内部调用时,通常写在这个函数的内部,这样对于全局来说隐藏了这个函数。如下例中的doSomethingElse方法,全局就无法方法

function doSomething() {
    function doSomethingElse() {
        //一些代码
    }
    doSomethingElse();//函数内部可以调用 但外部不能
}
 doSomethingElse();//报错 这里不能调用

3.3 避免冲突

通常避免冲突有两种方法:

  • 全局命名空间
  • 模块管理

这里我们重点说一下全局命名空间,它在第三方库中运用的比较多,具体做法如下:

var $ = {//全局命名空间为:$
    add:function(){},
    remove:function(){}
};
$.add();//通过全局命名空间调用里面的方法

3.4 立即执行函数

立即执行函数(Immediately Invoked Function Expression),也就是IIFE,表示会立即执行的函数,它在平时写代码的时候用的还是比较多的。

var a = 2;
(function IIFE(){
    var a = 3;
    console.log( a ); // 3
})();
console.log( a ); // 2

如上,立即执行函数可以有效地避免变量地覆盖,其实就是利用作用域来隐藏内部实现。为什么它会立即执行呢,原因在上面代码的第5行,最后的括号表示执行该函数,就跟调用函数一样,当然如果有参数也可以传递参数。上面的函数名IIFE是可以去掉的,在JS中如果函数是声明,那么函数名必须要写以保证之后调用可以用“函数名()”这种形式来调用;如果只是为了返回它的引用(也就是首地址,就跟上面一样,或者当参数传递的时候)。那么名称可以写也可以不写,并且这个名称并不会污染全局,因为个函数并不是声明,所以也就不可以用“函数名()”来调用,不过写上函数名在调试的时候会更直观。
立即执行函数还有另外一种形式,如下:

(function(){ .. }())

3.5 立即执行函数的用途

3.5.1 避免undefined被覆盖
undefined = true; // 如果有人if(a == undefined){}时肯定会奔溃的
(function IIFE( undefined ){
    var a;
    if (a === undefined) {
        console.log( "这里的undefined是对的!" );
    }
})();

由于最后一行调用的时候什么也没有传,所以第2行undefined的值是正真的没有声明,所以undefined外面被覆盖也就不起作用了。

3.5.1 倒置代码

可以利用立即执行函数使得传递的参数有我们自己决定,函数的内容由别人来决定,如下代码:

var a = 2;
(function IIFE( def ){
    def( window );
})(function def( global ){
    var a = 3;
    console.log( a ); // 3
    console.log( global.a ); // 2
});

我们定义的IIFE函数传递的参数是一个函数,它调用的时候会传递一个window对象,而当第四行正真传递了一个def的函数进去的时候,其调用是在第三行,那么参数global的值就是window。

3.6 块作用域

块作用域:通常,编程语言用花括号(也就是这个{})括起来所形成的作用域就是块作用域。

通常情况下JS用花括号括起来是没有块作用域的!!!,如下:

for (var i=0; i<10; i++) {
}
console.log( i );//打印 10

for循环10次什么都不做,在它后面打印i也可以得到值,因为上面的花括号并不能形成作用域,这个其他语言如Java有很大的不同。
上面说到的是通常情况下,那么特殊情况有哪些呢?

3.6.1 with

上一节说过with从对象中会创建出自己的作用域。

3.6.2 try/catch

JS中也有异常处理就是try/catch,catch块会形成块作用域,但是try并不会形成块作用域,如下:

try {
    undefined(); // 这行代码会有异常
} catch (err) {
    console.log( err ); // 打印err的值
}
console.log( err ); // ReferenceError: `err` not found      
3.6.2 let/const

let和const是ES6引入的,他们所在的块是拥有作用域的,其中let是变量类似于var,但是所在块有该变量的作用域;const与let类似,但是表示常量,值是不能修改的,修改就报错。这里给的例子是上面循环的例子,如下,这里的第三行代码在花括号外面是访问不到变量i的。

for (let i=0; i<10; i++) {
}
console.log( i ); // ReferenceError     
利用CAT12做皮层指标的统计分析及可视化笔记记录 利用CAT12做皮层指标的统计分析及可视化 文章目录利用CAT12做皮层指标的统计分析及可视化前言一、统计步骤1.Basic Models2.Estimate Surface Models3.Results二、可视化1.t值可视化2.p值可视化 前言 本来没有打算做SBM的,因为自己是新手小白,许多操作都不太懂,但最后还是打算做一下,于是就从上周末开始将很久之前跑VBM得到的surf文件夹中的数据捡起来继续做皮层分析,因为之前看了一个博主的博客,关于如何做SBM已经讲得非常清楚了,但是在统计及可视化这里,我 阅读详情

相关推荐

Cobalt Strike4.0安装包(内附中文版)

1.什么是 Cobalt Strike Cobalt Strike 是一个为对手模拟和红队行动而设计的平台,主要用于执行有目标的攻击和模拟高级威胁 者的后渗透行动。 Cobalt Strike已经不再使用MSF而是作为单独的平台使用,它分为客户端与服务端,服务端是一个,客户端可以有多个,可被团队进行分布式协团操作。集成了端口转发、扫描多模式端口Listener、Windows exe程序生成、W...

梦之序章的博客 2万+

《你不知道的JavaScript上卷》知识点整理与读书笔记

第一部分 作用域和闭包 第1章 作用域是什么 1.1编译原理 1.2理解作用域 1.3作用域嵌套 1.5异常 第2章 词法作用域 第3章 函数作用域和块作用域 第5章 作用域和闭包 第二部分 this和对象原型 第1章 关于this 第2章 this全面解析 第3章 对象 第4章 混合对象“类” 第5章 原型 第6章 行为委托 之前被好友推荐过《你不知道的JavaScript》这一系列的书籍。上中下三本书都不算厚,内容也是比较独立。本来是打算一个月内看完这本上卷和下卷,可总是因为自己的.

qq_45549336的博客 6405

KEIL-MDK代码美化神器:AStyle配置全攻略(附常用参数详解)

本文详细介绍了如何在KEIL-MDK中配置和使用AStyle代码格式化工具,包括基础参数设置、高级格式控制、团队协作方案以及KEIL深度集成技巧。通过合理的AStyle配置,开发者可以显著提升代码风格一致性,优化团队协作效率,特别适合嵌入式开发项目。

weixin_30505225的博客 147

你不知道的JS(上卷)——读书笔记3 函数作用域和块作用域

第三章 函数中的作用域 众所周知,JS中的函数可以当做一个作用域,在该作用域里面定义着标识符(变量)以及函数,函数作用域之间又可以嵌套。函数作用域的含义是指,属于这个函数的全部标识符都可以在整个函数的范围内使用以及复用(包括在嵌套的作用域中),这种设计能充分利用JS的动态特性(静态类型语言在编译时便已确定变量的类型,而动态类型语言的变量类型要到程序运行的时候,待变量被赋予某个值之后,才会具有某种类型) 隐藏内部实现 把代码片段用一个函数包裹起来(创建新的函数作用域),可以隐藏其在原来该函数位置的访问。好处是

weixin_44710964的博客 253

基于opencv的鱼群检测和数量统计识别鱼群密度带界面

摘要:本项目利用OpenCV图像处理技术实现了视频鱼类自动检测计数系统。通过背景减除、形态学处理和轮廓检测等方法,在视频帧中标记鱼类并统计数量。系统包含视频读取、前景提取、轮廓分析、中心点跟踪等核心功能,可实时显示计数结果。适用于水产养殖、生态监测等领域,具有实用价值。未来可通过参数优化、引入深度学习和多目标跟踪技术进一步提升准确性。(147字)

1721

GEE高阶应用——如何绘制2000-2022年土地利用变化轨迹时序图

土地利用变化是指在一定时间范围内,土地利用类型和结构发生的变化。时序变化是指这种变化随时间的推移而发生的序列变化。土地利用变化轨迹的时序变化具体介绍如下:首先,土地利用变化轨迹的时序变化体现在土地利用类型的演变上。在过去的几十年里,随着人口的增加、经济的发展和城市化的推进,土地利用类型发生了显著的变化。传统的农田逐渐减少,而城市、工业、交通、居住等用地的面积不断扩大。同时,随着环境保护意识的提高,生态保护用地、森林、湿地等绿色用地的面积也在增加。

此星光明博客 1113

你不知道的JavaScript(上卷)读书笔记

《你不知道的JavaScript(上卷)》读书笔记。

多啦的博客 865

通信算法之281:大疆DJI无人机ID-DJI DroneID开源工程-相关问题-协议信息问题

ZC序列的参数未知。但是,使用第一个或第二个零相关序列对每个OFDM符号进行相位调整,对于直接相邻于使用过的零相关序列的时间上的OFDM符号工作得很好,但对其它符号效果不佳。由于符号的顺序没有改变,而9 OFDM符号情况下的第一个OFDM符号没有用处,因此本存储库中的脚本对待所有突发都是有9个OFDM符号的,并且不对第一个OFDM符号做任何处理。棘手的地方在于需要生成比数据载波数量(始终为600)多1个的零相关序列,零化中间元素,将生成的样本映射到FFT的中心(采样率决定bin的数量),然后计算IFFT。

leegang12的专栏 1623

【读书笔记】《你不知道的JavaScript(上卷)》——第一部分 作用域与闭包

文章目录第1章 作用域是什么1.1 编译原理1.2 理解作用域1.3 作用域嵌套1.4 异常第2章 词法作用域 github:https://github.com/getify/You-Dont-Know-JS/tree/1ed-zh-CN gitee:https://gitee.com/OliverDaDa/You-Dont-Know-JS —— forked from github 第1章 作用域是什么 1.1 编译原理 相对来说JavaScript并不能像其他编译语言一样,可以将编译结果直接作

程序边界 786

【数据集介绍】MVTec 3D AD数据集介绍

MVTec AD(MVTec Anomaly Detection)数据集是用于异常检测的计算机视觉数据集。该数据集包含来自工业生产中不同材料和产品的图像,包括玻璃、塑料、纺织品等。每个类别都包含正常样本和异常样本。这些异常样本包括各种常见的生产缺陷,如划痕、裂纹、凹陷等。MVTec AD数据集旨在帮助研究人员和从业者开发和评估用于检测工业制造中物体缺陷的算法和系统。

原来也有北瓜 7754

多源异构数据在线可视化ETL编排平台深度实践:基于Python与Apache Calcite的现代数据管道构建

在当今企业数据环境中,数据源呈现爆发式增长与高度异构性。传统ETL工具面对多源(MySQL、PostgreSQL、MongoDB、Hive、文件系统等)与异构(结构化、半结构化、非结构化)数据时,往往面临扩展性差、学习曲线陡峭、难以融入现代DevOps体系等问题。本文深入探讨了如何构建一个基于Python/Pandas、Apache Calcite(通过JPype桥接)以及Vue.js前端的轻量级、在线可视化ETL编排平台。

2201_76125261的博客 78

你不知道的Javascript(上卷)读书笔记之三 ---- 函数作用域与块作用域

1. 函数中的作用域 函数作用域的含义是指属于这个函数的全部变量都可以在整个函数范围内使用以及复用 2. 隐藏内部实现 函数经常使用于隐藏”内部实现”,可以把变量和函数包裹在一个函数的作用域中,然后用这个作用域来隐藏它们。 这种基于作用域的隐藏方法基于软件设计中的最小特权原则(最小授权/最小暴露原则),比如模块的API设计。 引申一下,如果变量和函数都放在全局作用域中,...

deng2131的博客 257

基于YOLOv8的违规抽烟/打电话检测系统:从数据集构建到部署实战

模型优点缺点精度高速度慢(5 FPS)SSD速度快小目标检测差YOLOv5平衡性好官方支持停止YOLOv8最新、最快、最准需要PyTorch环境YOLOv8相比前代:骨干网络升级(C2f模块)无锚框检测(Anchor-Free)动态任务对齐分配(TaskAlignedAssigner)支持分类/检测/分割/姿态估计。

YOLO 98

《你不知道的JavaScript》(上卷)读书笔记:作用域和闭包1.4

函数作用域和块作用域 作用域包含了一些“容器”,其中包含了标识符(变量,函数)的定义,这些容器互相嵌套并整齐排列成蜂窝状,排列的结构是在写代码时定义的。 但是,究竟是什么生成了一个新的容器?只有函数可以吗?JavaScript中的其它结构能生成容器吗? 对于此问题,最常见的答案是JavaScript具有基于函数的作用域,意味着每声明一个函数都会为其自身创建一个容器,而其它结构都不会创建作用域...

qq_34241037的博客 299

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

《你不知道的JavaScript》--读书笔记

???? 上卷: 作用域和闭包, this和对象原型 ???? 中卷: 类型和语法, 异步和性能 ???? 下卷:起步上路,es6及更新版本 目录 Part 1 作用域和闭包 chart 1 作用域是什么 1.1 编译原理 1.2 理解作用域 1.3 作用域嵌套 1.4 异常 1.5 ????小结 chart 2 词法作用域 2.1 词法阶段 2.2 欺骗词法 2.3 ????小结 Part 1 作用域和闭包 chart 1 作用域是什么 1.1 编译原理 javas

一只胖胖胖miao 974

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

《你不知道的JavaScript上卷》知识点整理与读书笔记_百度你不知道的js书知识

/也就是这个对象本身,想一想为什么this是指向这个对象本身,我保证前面的this里面讲的知识,绝对可以分析出来这里的this指向哪里。foo.call(obj)//2 这里显示调用,foo中this是obj,所以回调中是obj的a。//这行代码只是为了验证()中的var i,以及{}中的a,最后在外部均可以访问到这两个标识符。foo()//3 这里光秃秃调用,foo中this是window,所以回调中是window的a。//当然把最后的()放进去的效果也是一样的,仅仅是书写风格不同。

m0_61067876的博客 1146

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

你不知道的JavaScript 上卷读书笔记

看了《你不知道的JavaScript 上》,为了防止自己忘记,特此记下与我而言的部分重点 任何足够先进的技术都和魔法无异。 ——Arthur C. Clarke 作用域和闭包 编译原理 分词/词法分析(Tokenizing/Lexing) 编程语言的所有字块与符号都会被分解为词法单元; var a = 2; //分解为var、a、=、2、;。 // ! 空格是否被当做词法单元,取决于空格在这门语言中是否具有意义 解析/语法分析(Parsing) 这个过程是将词法单元流转换成一个由元素逐.

weixin_42832836的博客 679

《你不知道的javascript(上卷)》——读书笔记

《你不知道的javascript(上卷)》 摘要:         我觉得这本数对javascript的一些难点有深层次的分析,遂打算近日拿来学习.          本书目录:                 第一部分: 作用域和闭包                第二部分: this和对象原型 第一部分: 作用域 概念:引

weixin_40821790的博客 1044

你不知道的JavaScript(上卷)——读书笔记

1. 作用域 1.1 角色 引擎 从头到尾负责整个JavaScript程序的编译及执行过程。 编译器 引擎的好朋友之一,负责语法分析及代码生成等脏活累活。 作用域 作用域引擎的另一位好朋友,负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。 1.2 编译过程 RHS查询 (赋值操作的左侧) 简单地找到某个变量 LHS查询(赋值操作的右侧) 试图找到变量地容器本身,从而可以对其赋值 1.3 作用域嵌套 当

Floyd的博客 292

你不知道的JS(上卷)——读书笔记6 动态作用域、块作用域的替代方案、this词法

附录A 动态作用域 大部分语言都是基于词法作用域,JS也是词法作用域 词法作用域是在代码编写时就已经确定好了的(取决于代码编写的位置),除了eval和with 而动态作用域关心的是函数在何处被调用 总结来说,动态作用域的作用域链是基于调用栈的(函数的调用栈),而词法作用域的作用域链是基于作用域的嵌套 附录B 块作用域的替代方案 想要在ES6之前只用块作用域,可以使用catch: try{throw:2;}catch(a){ console.log(a); //2 } 这段代码虽然可以达到块作用域的效果,

weixin_44710964的博客 222

JavaScript笔记 | 作用域和闭包 |《你不知道的JavaScript(上卷)》第一部分

《你不知道的JavaScript(上卷)》 第一部分 作用域和闭包 笔记

qq_42376600的博客 445

《你不知道的JavaScript》 (上) 阅读摘要

本书属于基础类书籍,会有比较多的基础知识,所以这里仅记录平常不怎么容易注意到的知识点,不会全记,供大家和自己翻阅

前端下午茶 235

《你不知道的JS》读书笔记

学习方式:一边看书,一边学习他人的博客,把一些关键的部分记录在此,其他的贴出他人博客的链接。 文章目录最佳实践上卷作用域JS是编译语言引擎、编译器和作用域中卷下卷 最佳实践 上卷 作用域 Javascript引擎,编译器,作用域三者之间的关系及LHS和RHS的区别 JS是编译语言 JS代码片在执行前要先编译:它的编译过程(通常)是在实际执行前进行的,而且也不会产生可移植的编译结果。 引擎、编译器和作用域 引擎: 负责整个Javascript程序的编译及执行过程。 编译器:负责语法分析及代码生成。 作用域

DanmoSAMA的博客~ 443

【读书笔记】《你不知道的 JavaScript(上卷)》

第一部分 作用域和闭包 1.1 作用域是什么? 作用域是一套规则,用于确定在何处以及如何查找变量(标识符)。如果查找的目的是对变量进行赋值,那么就会使用 LHS 查询;如果目的是获取变量的值,就会使用 RHS 查询。赋值操作符会导致 LHS 查询。=操作符或调用函数时传入参数的操作都会导致关联作用域的赋值操作。 JavaScript 引擎首先会在代码执行前对其进行编译(词法分析->语法分析...

日常问题bug解决、学习分享、个人杂谈等等随便写写哈哈哈 167

读书笔记-你不知道的js(上卷)

作用域、闭包、对象、

junjiahuang的博客 276

你不知道的JS(上卷)——读书笔记2 词法作用域

第二章 词法作用域 JS语言是词法作用域(除此之外有的语言是动态作用域),其意思是作用域由你写的代码(变量、块作用域)所在的位置来决定的,在词法分析器处理代码时会保持作用域不变(有些例外情况) 由于作用域嵌套的规则,使得找到指定的标识符(变量)需要从当前的作用域开始找,逐级向上进行查找,当查找到变量后便停止查找 遮蔽效应:根据刚才规则,只要在里层作用域创建相同名字标识符,就可以使外层作用域的变量不会被访问到。但是由于声明的全局变量会自动成为全局对象(比如window对象)的属性,所以可以直接通过全局对象的属

weixin_44710964的博客 193
上一篇: HTML自定义滚动条(仿网易邮箱滚动条)
下一篇: 读书笔记《你不知道的JavaScript上卷》1.4提升
javao_0
博客等级 码龄12年 6粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值