作用域

javascript图解之作用域链

家住魔仙堡 提交于 2020-03-11 10:43:56
在这篇文章中,我假设您了解执行上下文的基本知识:不过,我很快也会就此写一篇文章😃 让我们看看下面的代码: const name = "Lydia" const age = 21 const city = "San Francisco" function getPersonInfo() { const name = "Sarah" const age = 22 return `${name} is ${age} and lives in ${city}` } console.log(getPersonInfo()) 我们正在调用getPersonInfo函数,该函数返回一个字符串,其中包含name、age和city变量的值: Sarah 22 San Francisco。但是,getPersonInfo函数不包含名为city🤨?它怎么知道city的值? 首先,为不同的上下文设置内存空间。我们有默认的全局上下文(浏览器中的窗口、节点中的全局)和已被调用的getPersonInfo函数的局部上下文。每个上下文也有一个作用域链。 对于getPersonInfo函数,作用域链看起来像这样(不用担心,它现在还不一定有意义): 作用域链基本上是对对象的“引用链”,这些对象包含对在该执行上下文中可引用的值(和其他作用域)的引用。(⛓):“嘿,这些都是您可以在此上下文中引用的值”。

vue中的插槽(slot)

◇◆丶佛笑我妖孽 提交于 2020-03-10 08:39:41
vue中的插槽,指的是子组件中提供给父组件使用的一个占位符,用<slot></slot>标签表示,父组件可以在这个占位符中填充任何模板代码,比如HTML、组件等,填充的内容会替换掉子组件的<slot></slot>标签(替换占位符)。 vue中的插槽大致可以分为默认插槽、具名插槽和作用域插槽三种。 默认插槽 默认插槽是最简单的一种插槽,和上面的描述一致,就是通过替换占位符达到在父组件中更改子组件中内容的效果。 在子组件中放置一个占位符(插槽): <template> <span> <span>谁是最可爱的人?</span> <slot></slot> </span> </template> <script> export default { name: 'child' } </script> 然后在父组件中引用这个子组件,并给这个占位符(插槽)填充内容: <template> <div> <span>今日问答:</span> <child> <span>当然是yanggb了</span> </child> </div> </template> 这个时候页面展现的内容就会是【今日问答:谁是最可爱的人?当然是yanggb了】。 在上面的例子中,如果在子组件中没有放置<slot><slot>标签占位符,就不会有【当然是yanggb了】这个答案了,问题永远得不到任何回应

JavaScript中var、let、const三者的区别

元气小坏坏 提交于 2020-03-09 19:00:57
文章目录 var var定义变量存在的问题 let const var 在ES6发布之前,JavaScript的作用域有 全局作用域 和 函数内部作用域 两部分,没有 块级作用域 一说。 块级作用域 一般由{ }包括,if 和 for 里的{ }同样为块级作用域。 初学JS最常见的变量修饰符就是var了,var定义的变量区别也主要体现在全局变量和局部变量上。 var在函数外部声明的变量作用域为全局,在任何地方都可以访问; var在函数内部声明的变量仅作用在函数内部,如果不用var则是全局变量。 // 函数内部用var修饰,外部不能使用 function methodOne(){ var a = "Tom"; } var a = "Tom"; function methondTwo(){ console.log(a);//var定义全局变量,函数内部能够使用。 } var定义变量存在的问题 块级作用域外扔能使用 for(var i = 0; i < 2 ; i++){ var a = "a"; } console.log(a); 跳出 for 循环后仍旧能访问变量 a 以及变量 i 。 循环内变量的过度共享 for (var i = 0; i < 3; i++) { setTimeout(function () { console.log(i) }, 1000); }

变量、常量、作用域

馋奶兔 提交于 2020-03-08 22:59:00
变量、常量、作用域 一、变量(属性) 变量是什么:就是可以变化的量! Java是一种强类型语言,每个变量都必须声明其类型。 Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。 格式:数据类型 变量名 = 值; 代码示例: // 数据类型 变量名 = 值; int a0 = 1 ; // 可以使用逗号隔开来声明多个同类型变量,但为了代码可读性,并不建议 int a1 = 2 , a2 = 3 ; 注意事项: 每个变量都有类型,类型可以是基本类型,也可以是是引用类型。 变量名必须是合法的标识符。 变量声明是一条完整的语句,因此每一个声明都必须以分号结束。 二、常量 常量(Constant):初始化(initialize)后不能再改变值!不会变动的值。 所谓常量,可以理解为一种特殊的变量,它的值被设定后,在程序运行过程中不允许被改变。 常量一般使用大写字符。 代码示例: /** * 常量 */ public class Demo { // 修饰符不存在先后顺序 static final double PI = 3.141592654 ; // final static double PI = 3.141592654; // main方法 public static void main ( String [ ] args ) { System . out .

JS面向对象之作用域

折月煮酒 提交于 2020-03-08 02:24:15
作用域 词法作用域 作用域 域 表示的就是 范围 ,即 作用范围 就是一个名字在什么地方能使用,在什么地方不能使用 块级作用域 块 级别的作用范围 // 在 c , java 等编程语言中,下面的语法报错 { var num = 123; // 应该用int , 这里是伪代码 { console.log(num); // 123 } console.log(num); // 报错 } 在 js 中采取词法作用域 词法(代码) 作用域,就是代码在编写过程中体现出来的作用范围,代码一旦写好,不用执行,他的作用范围就已经确定好了,这个就是所谓的 词法作用域 在 js 中的词法作用域规则 1. 函数允许方位函数外的数据 2. 整个代码结构中只有函数可以限定作用域 3. 作用规则首先是 提升规则 分析 4. 就近原则 如果当前作用规则有了名字,就不考虑外面的名字 在 js 中作用域分析方法 1. 先进行预解析,分析预解析过程 * 程序在执行过程, 会先将代码读取到内存中检查. 会将所有的声明在此时进行标记. 所谓的标记就是 让 js 解释器知道有这个名字, 后面在使用名字的时候, 不会出现未定义的错误. 这个标记过程就是提升. * 声明 1. 名字的声明, 标识符的声明( 变量名声明 ) * 名字的声明就是让我们的解释器知道有这个名字 * 名字没有任何数据与之对应 2. 函数的声明 *

js作用域和词法分析

狂风中的少年 提交于 2020-03-08 02:22:20
  都知道js中不存在类似于c++等语言的块级作用域,例如for循环中定义的变量,其实是属于当前对象下的属性,同一对象下可以随便访问。 只有函数可以限定一个变量的作用范围,即函数才是变量的作用域。   对于函数的变量访问时遵循作用域链的,即当前函数运行时会有一个当前作用域,当饮用某个变量时,会先查找当前作用域内是否存在该变量的定义,如果不存在则根据作用域链向上去查找父函数的作用域,有则拿来使用,没有则继续向上直到全局作用域。关于作用域链这里就不仔细描述,简单而言,类似原型链,从全局函数直到当前函数的作用域存在一种相互包含的关系,子可以向上访问,但是父不可以向下访问子函数的变量,这样层层嵌套的关系链。   类似这样的:  var num = 10;   function a (){     alert(num);   }   a() //结果alert(10),a里没有num所以向上查找外层的作用域,有且等于10所以弹出10而不是undefined.   但是,下面的代码就是undefined了:   var num = 10; var num = 10;   function a (){     alert(num);     var num = 11;   }    为什么呢? a()执行时虽然num=11没有赋值但是父级作用域里是有num=10的,不应该是 undefined呀

js闭包

余生颓废 提交于 2020-03-08 01:09:26
​ 今天呢咱们来聊聊这个js闭包,我们基本上在面试中,必然会问到的问题:什么是闭包?说说你对闭包的理解.闭包的作用是什么? ​ 闭包也是一个很不好理解的概念,往往我们遇到的机会很多很多,很多朋友呢都说了对闭包的理解,问题表达的方式不一样,但是呢,最后都对闭包没有很清晰的理解.所以呢我这边就帮助大家理解什么是闭包.其实说起来,可以深,也可以浅.先由浅着说.之前呢,在网上也是找了不少的资料,看见人家理解的闭包,我提取出了说法有问题 的4点: ​ 1.闭包是指有权访问另一个函数作用域中变量(参数)的函数(不可取) ​ 2.闭包就是能读取其他函数内部变量的函数(不可取) ​ 3.闭包可以理解成定义一个函数内部的函数(不可取) ​ 4.函数就是闭包(不可取) ​ 这4点呢,其实呢,怎么说呢,不能否认它是错的,只能说不严谨,第一点,可以得到一个结论,闭包是一个函数,第二点也差不多的意思,第三点有意思了,定义一个函数内部的函数,的确有这个特征,而第四点,其实也是对的,因为MDN上的解释是:闭包是一个特殊的函数对象.那上面的几种说法都是不严谨的,其实最终我查询资料,都归纳了一句话: ​ 当一个函数能够记住并访问到其所在的词法作用域及作用域链,特别强调是在其定义的作用域外进行的访问,此时该函数和其上层执行上下文共同构成闭包 ​ 怎么理解这句话呢,其中包含两个新的名词,词法作用域及作用域链

javascript 面向对象

自闭症网瘾萝莉.ら 提交于 2020-03-07 12:23:37
1. arguments An array-like object corresponding to the arguments passed to a function. arguments.callee   Reference to the currently executing function. arguments.caller --- arguments.callee.caller   (Obsolete)   Reference to the function that invoked the currently executing function. arguments.length   Reference to the number of arguments passed to the function. function myConcat(separator) { var result = ""; // iterate through non-separator arguments for (var i = 1; i < arguments.length; i++) { result += arguments[i] + separator; } return result; } document.write(myConcat('-', "red", "green"

es6新特性---let const

前提是你 提交于 2020-03-07 11:48:31
想要学习更多,推荐看阮大神的http://es6.ruanyifeng.com/#docs/let 在学习之前得知道作用域 ES5 中作用域有:全局作用域、函数作用域。没有块作用域的概念。 ES6 中新增了块级作用域。块作用域由 { } 包括,if语句和 for语句里面的{ }也属于块作用域。 ES6 允许块级作用域的任意嵌套 let命令 ES6 新增的 let 命令,可以用来声明变量。它的用法类似于 var ,但是所声明的变量,只在 let 命令所在的代码块内有效。 let命令适合用在for循环中,计数器 i 只在 for 循环体内有效,在循环体外引用就会报错 不存在变量提升 var 命令会发生”变量提升“现象,即变量可以在声明之前使用,值为 undefined 。 let 命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。 不允许重复声明 let 不允许在相同作用域内,重复声明同一个变量。 const命令 const 声明一个只读的常量。一旦声明,常量的值就不能改变。 来源: oschina 链接: https://my.oschina.net/u/3869887/blog/1920589

关于this的问题

纵饮孤独 提交于 2020-03-07 07:39:58
链接: https://www.nowcoder.com/questionTerminal/ad1aab0fd50a4185ac1ae450096d9095 来源:牛客网 var myObject = { foo: "bar" , func: function() { var self = this ; console.log( this .foo); console.log(self.foo); (function() { console.log( this .foo); console.log(self.foo); }()); } }; myObject.func(); 依次输出 bar bar undefined bar 理解关键:方法/函数是由谁(对象) 调用 的,方法/函数内部的 this 就指向谁(该对象); 注意:被谁调用,不是处于谁的作用域,即使在作用域 1、func是由myObject调用的,this指向 myObject。 2、self指向myObject,相当于 myObject的this的副本。 3、这个立即执行匿名函数表达式(IIFE)是由window调用的,this指向 window 。第三个是闭包,this指向window。 4、IIFE的作用域处于myObject.func的作用域中,本作用域找不到self变量,沿着作用域链向上查找self变量