作用域

JavaScript的变量作用域

巧了我就是萌 提交于 2020-03-05 11:41:02
在学习JavaScript的变量作用域之前,我们应当明确几点: JavaScript的变量作用域是基于其特有的作用域链的。 JavaScript没有块级作用域。 函数中声明的变量在整个函数中都有定义。 1、JavaScript的作用域链 首先看下下面这段代码: <script type="text/javascript"> var rain = 1; function rainman(){ var man = 2; function inner(){ var innerVar = 4; alert(rain); } inner(); //调用inner函数 } rainman(); //调用rainman函数 </script> 观察alert(rain);这句代码。JavaScript首先在inner函数中查找是否定义了变量rain,如果定义了则使用inner函数中的rain变量;如果inner函数中没有定义rain变量,JavaScript则会继续在rainman函数中查找是否定义了rain变量,在这段代码中rainman函数体内没有定义rain变量,则JavaScript引擎会继续向上(全局对象)查找是否定义了rain;在全局对象中我们定义了rain = 1,因此最终结果会弹出'1'。 作用域链:JavaScript需要查询一个变量x时,首先会查找作用域链的第一个对象

JavaScript变量的作用域

痴心易碎 提交于 2020-03-05 11:34:07
虽然 《JavaScript权威指南》这本书很好,但是有一些东西让人容易理解错。最近在恶补基础,结合这本书,我想把变量的作用域重新梳理一下: "一个变量的作用域(scope)是程序源代码中定义这个变量的区域。 全局变量拥有全局作用域,在JavaScript代码中的任何地方都是有定义的。然而在函数内声明的变量只在函数体内有定义。"----摘自《JavaScript权威指南》第6版 "在一些类似C语言的编程语言中,花括号内的每一段代码都具有各自的作用域,而且变量在声明他们的代码段之外是不可见的,我们称之为块级作用域。" ----摘自《JavaScript权威指南》第6版 在ECMAScript 6之前是没有块级作用域的,这里说的是 ECMAScript 5.1规范标准。 变量分全局变量,局部变量。这就决定了变量的作用域:全局作用域、与函数作用域 demo1: var scope = "global"; //声明一个全局变量 function check() { var scope = "local"; //声明一个同名的局部变量 return scope; //返回局部变量的值,而不是全局变量的值 } check(); => "local" 解: " 在函数体内,局部变量的优先级高于同名的全局变量。如果在函数内声明的一个局部变量or函数参数中带有的变量和全局变量重名

Python之变量作用域

大兔子大兔子 提交于 2020-03-05 03:14:20
变量作用域   Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。   变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种,分别是: L (Local) 局部作用域 E (Enclosing) 闭包函数外的函数中 G (Global) 全局作用域 B (Built-in) 内建作用域 以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。 各作用域关系如图: 内建作用域: a = int(3.14) #int函数在内建作用域中NAME='John' #NAME在全局作用域中 def fun(): name='July' #闭包函数外的函数域 def fun2(): name='Jack' #局部作用域 print(name) fun() #'Jack'   Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这这些语句内定义的变量,外部也可以访问: if True: a=123 print(a) #-------------- 123

js作用域和作用域链

回眸只為那壹抹淺笑 提交于 2020-03-04 19:25:26
作用域:在 js预编译 时、代码执行之前对全局或局部的变量进行收集,存放在一指定内存中scope,执行时对scope进行访问,scope 就是全局或局部的作用域。 如: 1 function test() { 2 var a = 123; 3 } 4 5 test(); 在test() 执行之前对test 进行预编译 生成test 的 scope(AO Activetion Object)。收集test 函数中的变量存放在scope中。 此时test 的scope 为: {   a:undefined } 在test 函数执行时 对 scope 中的 a 变量进行赋值,a = 123; 实际上在全局环境进行预编译时也会产生一个作用域,在test 被定义时会在test 函数上定义一个作用域数组([[Scopes]])。并将全局作用域放入test的作用域数组中。 如: 1 var a = 456; 2 3 function test() { 4 var b = 123; 5 console.log(b); 6 console.log(a); 7 } 8 9 test(); 在全局环境进行预编译时,会生成全局作用域Global Global {   a: undefined,   test: undefined } 此时test 函数的作用域数组中就已经包含了Global test.[

js作用域面试题大全

余生长醉 提交于 2020-03-04 17:06:17
什么是作用域: 浏览器给js的生存环境叫作用域。 什么是变量提升: Js 代码执行前,浏览器会给一个全局作用域 window Window 分两个模块一个是存储模块一个是执行模块 存储模块找到所有的 var 和 function 关键字给这些变量添加内存地址 执行模块,代码从上到下执行,遇到变量就会去存储模块查找,有和没有 有就看你赋值没有,赋值了就是后面的值没有赋值就是 undefined 。 没有结果就是 xxx is not defined 什么是原型链: 函数内部的变量被使用时,首先会在自己的私有作用域下查找是否有这个变量,有就直接使用,没有就向他的上一级查找,父级有就使用父级的,父级没有就以此继续向上查找直到查找带window有就使用没有就是is not defined。这种查找机制我们叫原型链。 案例分析 函数归属谁,跟她在哪调用没有关系,而是在哪定义有关。 函数外的变量叫全局变量,函数内的变量叫私有变量。 看变量归谁,看他在哪个作用域下声明。 360经典面试题 + function (){ console .log(a) var a = 5 ; function a (){} console .log(a) function b (){} b = 6 console .log(b) var c = d = b }() console .log(d) console

boost库:智能指针

心已入冬 提交于 2020-03-04 16:53:05
1. C98里的智能指针 std::auto_ptr ,本质上是一个普通的指针,通过地址来访问你一个动态分配的对象,初始化时需要传递一个由new操作符返回的对象地址。 std::auto_ptr的析构函数会调用delete操作符,释放掉其包含的对象内存。 智能指针的原理基于一个常见的习语:RAII(资源申请即初始化)。智能指针确保在任何情况下,动态分配的内存都能够得到正确释放,包括程序因为 异常而中断,原本用于释放内存的代码被跳过的场景。用一个动态分配的对象的地址来初始化智能指针,因为析构函数总是会被执行的,则包含的内存就会被释放。 2. 作用域指针 一个作用域指针独占一个动态分配的对象。其类名为:boost::scoped_ptr,一个作用域指针不能传递它所包含的对象的所有权到另一个作用域指针。作用域指针只是简单保存和独占一个内存地址,在不需要所有权传递的时候应该优先使用boost::scoped_ptr。 由于boost::scoped_ptr的析构函数中使用delete操作符来释放所包含的对象,因此boost::scoped_ptr不能用动态分配的数组来做初始化。 3. 作用域数组 与作用域指针相似。不同在于:作用域数组的析构函数使用delete[]操作符来释放所包含的对象,因此该操作符只能用于数组对象,所以作用域数组必须通过动态分配的数组来初始化。 4. 共享指针

JavaScript之作用域与闭包详解

点点圈 提交于 2020-03-04 16:25:39
前言: JavaScript是一种应用非常广泛的语言,其也有一些自身特点和优势,本文重在讲述其作用域机制以及闭包,会从一些实例来探讨其机理。 作用域在JavaScript程序员日常使用中有不同的含义,如下所示: this绑定的值; this绑定的值定义的执行上下文; 一个变量的“生命周期”; 变量的值解析方案,或词法绑定。 下面将讲诉JavaScript作用域概念,由此引出变量值解析方案的一般想法,最后再探讨JavaScript里闭包这一重要知识点。 1.全局作用域 所有浏览器都支持 window 对象,它表示浏览器窗口,JavaScript 全局对象、函数以及变量均自动成为 window 对象的成员。所以,全局变量是 window 对象的属性,全局函数是 window 对象的方法,甚至 HTML DOM 的 document 也是 window 对象的属性之一。 全局变量是JavaScript里生命周期(一个变量多长时间内保持一定的值)最长的变量,其将跨越整个程序,可以被程序中的任何函数方法访问。 在全局下声明的变量都会在window对象下,都在全局作用域中,我们可以通过window对象访问,也可以直接访问。 1 var name = "jeri"; 2 console.log(window.name); // 输出:jeri 3 console.log(name); // 输出

深入浅出 JavaScript 变量、作用域和内存 v 0.5

时光怂恿深爱的人放手 提交于 2020-03-04 16:25:05
本文主要从原理入手分享变量和作用域的相关知识,最后结合本文所分享知识,再次深入了解下闭包的运行原理。 主要参考《JS高级程序设计》 《JS权威指南》 《高性能 JS》 三本书。 目录 1 变量 1.1 变量的声明 1.2 变量类型的特点 2 执行环境和作用域 3 再谈谈闭包 变量 对 JavaScript 稍微有点了解的同学都知道,JavaScript 中的 变量 与其他语言的变量有很大区别。 JS 的弱类型的特性决定了变量只是在特定时间( 生命周期 , 作用域 中)用于保存特定值的一个名字而已。 一个变量可以在生命周期内任意改变类型。(太灵活了以至于好复杂) JavaScript 变量可以用来保存两种类型的值: 基本类型值 和 引用类型值 。 变量的声明 在JavaScript 程序中,使用一个变量之前应该先声明它。变量使用 var 关键字声明的。 如果在声明的时候没有进行初始化,那么默认初始化为undefined。 重复声明和遗漏声明 使用 var 关键字重复声明变量时合法的而且无害的,如果重复声明带有初始化,那么该声明和一条普通的赋值语句没什么两样。 在非严格模式下,给未声明的变量赋值,JS 会在全局作用域中创建一个同名变量,并赋值。(这会造成很多bug,因此应该使用 var 来声明变量。) 保存引用类型值的变量我们可以为其添加、改变和删除其属性和方法 。 var

JavaScript中的with语句

久未见 提交于 2020-03-04 16:24:29
执行环境的类型有两种:全局执行环境和局部执行环境(函数执行环境)。 1.全局执行环境的变量对象是window对象,是JS代码开始运行时的默认环境。全局执行环境的变量对象始终都是作用域链中的最后一个对象。但是还是有其他办法来延长作用域链。 2.函数执行环境,当某个函数被调用的时候,会先创建一个执行环境及其相应的作用域链,然后使用arguments对象和其他命名参数的值来初始化执行环境的变量对象。 有些语句可以在作用域前端临时增加一个变量对象,该变量对象会在代码执行之后被移除。 两种情况 1.with语句 2.try-catch语句的catch块 当执行流进入上面的任何一个语句时,作用域链就会被加长。 with语句 1.with语句的作用是将代码的作用域设置到一个特定的对象中。目的主要是为了简化多次编写同一个对象的工作。 2.使用with语句可以关联location对象,也就是说,在with语句的代码块内部,每个变量首先会被认为是一个局部变量,而如果在局部环境中找不到该变量的定义,则会查询location对象中是否有同名的属性。如果发现了同名的属性,则以location对象属性的值作为变量的值。 3.严格模式下不允许使用with语句,否则将视为语法错误。 4.with关键字的弊端 性能问题 使用with关键字后,js引擎不能对这段代码进行优化,

ES6新增常用语法

怎甘沉沦 提交于 2020-03-04 10:16:50
标题ES6新增常用语法 let与const let 和 var的作用相似都是用来声明变量的,ES5只有全局作用域和函数作用域,没有块级作用域,而let则实际上为JavaScript新增了块级作用域。用它所声明的变量,只在let命令所在的代码块内有效。 if ( true ) { var a = 10 ; let b = 12 ; console . log ( a ) ; // 10 console . log ( b ) ; // 12 } console . log ( a ) ; // 10 console . log ( b ) ; // 报错 ReferenceError: b is not defined const也用来声明变量,但是声明的是常量。一旦声明,常量的值就不能改变。 const PI = Math . PI PI = 23 //Module build failed: SyntaxError: /es6/app.js: "PI" is read-only 严格模式下当我们尝试去改变用const声明的常量时,浏览器就会报错。const有一个很好的应用场景,就是当我们引用第三方库的时声明的变量,用const来声明可以避免未来不小心重命名而导致出现bug const monent = require ( 'moment' ) 箭头函数 写法 let