JavaScript中---作用域
作用域:
变量还有函数作用的范围。
浏览器的内核主要有两大功能,一个是渲染页面,另一个就是我们的JavaScript的解释器了。
我们主要来说说JavaScript解释器,在解析时是怎么样的工作原理。
在解析的时候,首先会发生预解析,就是说不会直接一行一行去执行我们所写的代码,它会先去找有哪些声明的变量,遇见函数体的时候会把函数放到最上面的位置,当变量名和函数名重名的时候函数会替代变量声明。
在解析的时候碰到的是个函数体,那么会预先处理函数体中的变量或者函数,知道有哪些声明的事项。
如果是变量,那么在函数体中调用变量时,会取函数体当中的变量,如果函数体中没有,则找外层变量
函数预解析:
会将函数提到顶部
变量预解析:
会内部事先知道是否有该变量,但不会改变解析位置
当预解析时,变量和函数出现同名时,函数会替代掉变量,同一个命名只会存在一个
全局作用域 - 在任何地方都能访问
函数外定义的变量拥有全局作用域
不使用var定义的变量拥有全局作用域
所有window对象上的属性拥有全局作用域
局部作用域 - 只能在函数内部访问
使用var在函数内部定义的变量拥有局部作用域
全局:在任何地方都能调用
局部:只在当前作用范围(功能体)能调用
<script>
var a = 10;// 全局
function fn() {
console.log(a);//undefined
var a = 5;// 局部
console.log(a);//
}
fn(); </script>
闭包的概念
函数嵌套函数,内层函数可以访问外层函数中的变量
<script>
function fn1() {
var a = 1;
function fn2() {
a++;
console.log(a);
return a;
}
fn2();
}
fn1();
</script>
闭包的做大用处有两个:
一个是在函数体外部读取i内部的变量,另一个就是让这些变量始终保存在内存中。
JavaScript中---作用域的更多相关文章
- 从零开始讲解JavaScript中作用域链的概念及用途
从零开始讲解JavaScript中作用域链的概念及用途 引言 正文 一.执行环境 二.作用域链 三.块级作用域 四.其他情况 五.总结 结束语 引言 先点赞,再看博客,顺手可以点个关注. 微信公众号搜 ...
- JavaScript中作用域和作用域链的简单理解(变量提升)
通过阅读<JS高级程序设计>这本书,对js中的作用域和作用域链知识有了初步的了解和认识,准备成笔记供大家参考,笔记中字数比较多,但个人认为叙述的挺详细的,所以希望读者耐心看.再者,本人了解 ...
- JavaScript中作用域回顾(避免使用全局变量)(瀑布流的实现)(scroll事件)以及Django自定义模板函数回顾
页面显示照片样式为瀑布流: 上面的div个数可以按照自己安排进行划分.img的分布可以使用模板标签以及自定义模板函数进行排布: 自定义模板函数实现可以看,最后几列:python---django中模板 ...
- 理解JavaScript中作用域链的关系
javascript里的关系又多又乱.作用域链是一种单向的链式关系,还算简单清晰:this机制的调用关系,稍微有些复杂:而关于原型,则是prototype.proto和constructor的三角关系 ...
- javascript中作用域
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JavaScript中作用域和作用域链解析
学习js,肯定要学习作用域,js作用域和其他的主流语言的作用域还存在很大的区别. 一.js没有块级作用域. js没有块级作用域,就像这样: if(){ : console.log(a) //输出100 ...
- javascript中的作用域与作用域链
前几天,在写一段js代码时,出现了一些问题,调了很长时间也没有调通,其原因是,我在处理变量的作用域时错误地沿用了C++的作用域机制.因此我回炉了一次. 如果你使用过C++或java等一系列的面向对象的 ...
- javascript中的this与函数讲解
前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大家可以认为全局作用域其实就是Window函数的函数作用域,我们编写的js代码, ...
- Javascript的作用域、作用域链以及闭包
一.javascript中的作用域 ①全局变量-函数体外部进行声明 ②局部变量-函数体内部进行声明 1)函数级作用域 javascript语言中局部变量不同于C#.Java等高级语言,在这些高级语言内 ...
随机推荐
- golang bytes.Buffer Reset
func t() { a := []'} buf := new(bytes.Buffer) buf.Write(a) b := buf.Bytes() fmt.Println(b) buf.Reset ...
- 【工匠大道】 svn命令自己总结
本文地址 分享提纲: 1. svn 不常见单有用的命令 2. svn查看切换用户 1. svn自己总结的一些不常见,但有用的命令 1)[导出svn不带版本代码]导出不带svn版本控制的代码到本地 ...
- Windows10应用Docker部署DoNet Core
Win10和Mac稳定版的Docker发布了,之前看了下徐磊老师的几篇Docker4Dotnet的文章http://devopshub.cn/2016/07/08/docker4dotnet-1-ov ...
- Java NIO概述
Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然 Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Se ...
- 理解Java对象的交互:时钟显示程序
实现: 结构: 对象:时钟 - 对象:小时 - 对象:分钟 小时和分钟具有相同属性(值,上限),可以用一个类Display来定义这两个对象: 但是两者之间又具有联系( ...
- BPM实例分享——金额规则大写
金额规则大写 在涉及金额的流程中经常会遇到需要大写金额数据与小写金额匹配,如何实现输入数字后自动转换呢? 初级用法: 1.在默认表单基本属性javascript 中增加如下金额转换方法 /** 数字金 ...
- 利用私有的库MobileCoreServices检测正在安装的应用
利用的私有库检测正在安装的app 分为两步:第一,通过placeholderApplications获得所有的正在安装的app的信息 第二,遍历正在安装的app的信息,根据名称获得你想检测的app是否 ...
- 用drawRect的方式实现一个尺子
用drawRect的方式实现了一个尺子选择器,demo在这里:https://github.com/Phelthas/LXMRulerView 效果如图: 如果不考虑复用的问题,我感觉最简单的实现 ...
- Ionic设置ion-slide-box不启用(不通过$ionicSlideBoxDelegate)
猛地一看这个标题,可能觉得多此一举,直接$ionicSlideBoxDelegate. $getByHandle(handle). enableSlide(false)设置不就行了?是的,按理说就是这 ...
- Mac电脑如何读取Android手机上的文件
问题 一般Android手机用usb数据线连接到windows操作系统的电脑上后,会自动将手机存储卡以移动存储的方式显示在电脑里. 但是如果操作系统是Mac的,就没有这个存储设备.问题来了,Mac电脑 ...