作用域

作用域与作用域链

烈酒焚心 提交于 2019-12-03 23:42:32
理解 就是一块“地盘”,一个代码段所在的区域 它是静态的(相对于上下文对象,上下文是动态产生的,函数执行前),在编写代码时就确定了。           但是你调用两个fn(),作用域就一个,在你写代码时就确定了 分类 全局作用域 函数作用域 没有块作用域(ES6有了)if(true){ var a = 3} 作用 隔离变量,不同作用于下变量不会有冲突 产生多少作用域:N+1 来源: https://www.cnblogs.com/lucy-xyy/p/11709077.html

es6-1 let const 块状作用域

旧街凉风 提交于 2019-12-03 23:15:57
首先, es6是采用严格模式的, 在es5中如果要使用严格模式, 我们需要在 js 文件首行声明 "use strice" 块作用域 let 先看下面一段代码 function test() { for (var i = 0; i < 3; i++) { console.log(i) // 0 1 2 } console.log(i) // 3 } test() 这里 var 声明的变量 i , 在块的外边是可以拿到的, es6出现了块作用域, 通俗理解就是 { } 之内的域, var 声明的变量可以在同级块之外拿到 下列代码把 var 改成 let 之后 function test() { for (let i = 0; i < 3; i++) { console.log(i) // 0 1 2 } console.log(i) // Uncaught ReferenceError: i is not defined } test() 这里就拿不到声明的 i 变量了, 因为他只属于 for 循环这个 { } 块之中 注意 Uncaught ReferenceError: i is not defined 为什么报引用错误而不是 undefined ? 这就是因为 es6 默认采用的严格模式, 严格模式下变量未声明就不能引用 另外同一个变量名不能用 let 重复声明,

C Primer Plus 第12章 存储类、链接和内存管理

懵懂的女人 提交于 2019-12-03 21:40:30
12.1 存储类 C为变量提供了5种不同的存储模型,或称为存储类。还有基于指针的第6种存储模型,本章稍后(“分配内存malloc()和free()”小节)将会提到。可以按照一个变量(更一般地,一个数据对象)的存储时期来描述它,也可以按照它的作用域(SCOPE)以及它的链接(linkage)来描述它。存储时期就是变量在内存中保留的时间,变量的作用域和链接一起表明程序的哪些部分可以通过变量名来使用该变量。不同的存储类提供了变量的作用域、链接以及存储时期的不同组合。 您可以拥有供多个不同的源代码文件共享的变量、某个特定文件中所有函数都可以使用的变量、只有在某个特定函数中才可以使用的变量、甚至只有某个函数的一小部分内可以使用的变量。 您可以拥有在整个程序运行期间都存在的变量,或者只有在包含该变量的函数执行时才存在的变量。您也可以使用函数调用 为数据的存储显示的分配和释放内存。 12.1.1 作用域 作用域描述了程序中可以访问一个标识符的一个或多个区域。 一个C变量的作用域可以是 代码块作用域、函数原型作用域,或者文件作用域 。 到目前为止的程序实例中使用的都是代码块作用域变量。 在代码块中定义的变量具有代码块作用域(block scope),从该变量被定义的地方到包含该定义的代码块的末尾该变量均可见。 另外, 函数的形式参量尽管在函数的开始花括号前进行定义,同样也具有代码块作用域

Python--函数

雨燕双飞 提交于 2019-12-03 21:39:41
以下方法均在python解释器中进行了测试,读者复制代码时,记得去掉注释符。 #!/usr/bin/env python # -*- coding: utf-8 -*- # ******************************一:函数的定义和目的****************************** # 函数的格式如下: # def 函数名(参数1,参数2,参数3....参数n): # 函数体 #定义: # 1:"def"为函数的开始,在声明建立函数时一定要用def;def所在的这一行被称为函数头; # "test"为函数名称,注意名称最好要有一定意义,比如可以从名称看出来函数作用; # "(a,b)"为参数列表,通常称为形参; # ":"注意冒号,表示函数头结束; # 2: "c = a + b"从这一行起就是函数体,函数体是缩进了4个空格的代码块 # 3:"return" 是函数的关键字,意思是返回一个值;return作用:1:返回一个值;2:结束函数的运行,并返回到调用这个函数的地方 # 4:"res = add_fun(2,3)"调用函数,并传入两个参数(实参) # def add_fun(a,b): # c = a + b # return c # res = add_fun(2,3) # 目的: # 1:降低编程难度 2:代码重用 3:实现特定功能 # *

隐式全局变量,var a=1,b=1;与var a=b=1;的区别

时光怂恿深爱的人放手 提交于 2019-12-03 20:20:35
var a=1,b=1;与var a=b=1; 在工作中第一种写法比较常见,但是我们偶尔也图方便用到第二种写法,以前以为他们表达的语义是一样的,实际操作中发现不太一样,上例子说明: 1 console.log(a, b); 2 var a = 1, b = 1; 3 function fn() { 4 console.log(a, b); 5 var a = b = 2; 6 console.log(a, b); 7 } 8 fn(); 9 console.log(a, b); 看到上面一段代码,有一点开发经验的可能会脱口而出,从上至下: undefined undefined undefined undefined 2 2 1 1 很明显,既然这样问了,这个答案就不准确 变量提升: 当栈内存(作用域)形成,JS代码自上而下执行之前,浏览器首先会把所有带 var/function 关键词的进行提前 声明 或者 定义 ,这种预先处理机制称之为 变量提升 声明: var a (此时a=undefined) 定义: a=2(没有声明,所以放在哪里都是全局变量) var: 只声明未定义 funtion: 声明和赋值都完成了 变量提升 只发生在当前作用域,开始加载页面的时候 全局作用域是当前作用域 ,所以只会对全局作用域下的进行提升,因为变量提升是 发生在当前作用域

ES6学习笔记

僤鯓⒐⒋嵵緔 提交于 2019-12-03 20:08:46
学习地址: http://es6.ruanyifeng.com/#README ECMAScript和JavaScript关系 1996 年 11 月,JavaScript 的创造者 Netscape 公司,决定将 JavaScript 提交给标准化组织 ECMA,希望这种语言能够成为国际标准。次年,ECMA 发布 262 号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言称为 ECMAScript,这个版本就是 1.0 版。 1.let和const let 1)将值保留在块级作用域内 用来声明变量,用法和var类似,但是let定义的变量,只在let命令所在的代码块内有效。只要块级作用域内存在 let 命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。 2)不存在变量声明提升 3)不允许重复声明 不允许在相同作用域内,重复声明同一个变量。 4)暂时性死区 ES6 明确规定,如果区块中存在 let 和 const 命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。 在代码块内,使用 let 命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。 暂时性死区的本质就是,只要一进入当前作用域

JavaScript之例题中彻底理解this

点点圈 提交于 2019-12-03 18:23:26
本文共 2025 字,看完只需 8 分钟 概述 前面的文章讲解了 JavaScript 中的执行上下文,作用域,变量对象,this 的相关原理,但是我后来在网上看到一些例题的时候,依然没能全做对,说明自己有些细节还没能掌握,本文就结合例题进行深入实践,讨论函数在不同的调用方式 this 的指向问题。 老规矩,先给结论 1 和 结论2: this 始终指向最后调用它的对象 “箭头函数”的this,总是指向定义时所在的对象,而不是运行时所在的对象。 特别提示: 本文的例子,最好自己在浏览器控制台中去试一遍,看完过两天就会忘的,一定要实践。 一、隐式绑定 // 例 1 var name = "window" ; function foo ( ) { var name = "inner" ; console .log( this .name); } foo(); // ? 输出: window 例 1 中,非严格模式,由于 foo 函数是在全局环境中被调用,this 会被默认指向全局对象 window; 所以符合了我们的结论一: this 始终指向最后调用它的对象 二、一般函数和箭头函数的对象调用 // 例 2 var name = "window" ; var person = { name : "inner" , show1 : function ( ) { console .log(

JS学习笔记 之 作用域链

浪尽此生 提交于 2019-12-03 15:16:17
作用域,作用域链精解 函数 --> 函数类对象 可访问的属性:包括test.name test.prototype等 不可访问的属性:如 test.[[scope]] 等 ↓ ↓ 由于函数执行而产生的 作用域链 ->存储了 执行期上下文 的集合 ->呈链式连接 仅供javascript引擎存取 ↓ 函数每次执行时,对应独一无二的执行期上下文,执行完毕即销毁 (在某函数中)查找变量:从(该函数的)作用域链顶端,依次向下查找 作用域链图解 注意:下例中,b的定义是在a执行时产生的,a没有执行的话就没有b的定义 1 function a(){ 2 function b(){ 3 var b = 234; 4 } 5 var a = 123; 6 b(); 7 } 8 9 var glob = 100; 10 a(); 访问变量时,查找的是执行时的作用域链 a defined: --> 0 : GO    全局中的函数被定义时,生成全局的上下文 a execute: --> 0 : AO    全局的函数执行时,产生自己的独一无二的执行期上下文,链接到全局的上下文,形成自己的作用域链 1 : GO b defined: --> 0 : aAO    局部的函数被定义时,首先拿到已有的外部函数的上下文 1 : GO b execute: --> 0 : bAO    局部函数执行时

Vue中的v-slot详解,作用域插槽和具名插槽

ぐ巨炮叔叔 提交于 2019-12-03 12:14:47
1、具名插槽 有时候我们希望在指定的位置输出我们的子元素,这时候具名插槽就排上了用场。 //组件调用时 < MyFooter v - red : age . sync = "age" > < template v - slot : footer > //这里v-slot:后边的值与组件内的slot的name属性对应,也就是插槽的名称。 < div > list < / div > < / template > < / MyFooter > //书写组件时 < template > < div > { { age } } < div > < slot name = 'footer' / > //这里name的值就是这个插槽的名称。 < / div > < / div > < / template > 最后我们会在我们想要的位置将我们的元素放置。 2、作用域插槽 作用域插槽的主要作用是在书写插槽内容时可以获取到插槽作用域的值。 //组件调用 < ul > < myli : title = "val.title" > < template v - slot : footer = "message" > < div > { { message . aa } } < / div > < / template > < / myli > < / ul > //书写组件时 < template >

Vue-组件-插槽v-slot

杀马特。学长 韩版系。学妹 提交于 2019-12-03 12:13:36
看Vue文档整理笔记,便于自己学习 插槽 插槽内容 Vue 实现了一套内容分发的 API,这套 API 的设计灵感源自 Web Components 规范草案 ,将 <slot> 元素作为承载分发内容的出口。 它允许你像这样合成组件: <navigation-link url="/profile"> Your Profile </navigation-link> 然后你在 <navigation-link> 的模板中可能会写为: <a v-bind:href="url" class="nav-link" > <slot></slot> </a> 当组件渲染的时候, <slot></slot> 将会被替换为“Your Profile”。插槽内可以包含任何模板代码,包括 HTML: <navigation-link url="/profile"> <!-- 添加一个 Font Awesome 图标 --> <span class="fa fa-user"></span> Your Profile </navigation-link> 甚至其它的组件: <navigation-link url="/profile"> <!-- 添加一个图标的组件 --> <font-awesome-icon name="user"></font-awesome-icon> Your Profile <