Javascript中的词法作用域、动态作用域、函数作用域和块作用域(四)
一、js中的词法作用域和动态作用域
词法作用域也就是在词法阶段定义的作用域,也就是说词法作用域在代码书写时就已经确定了。
js中其实只有词法作用域,并没有动态作用域,this的执行机制让作用域表现的像动态作用域,this的绑定是在代码执行的时候确定的。
example1: 理解词法作用域
记住js中只有词法作用域没有真正的动态作用域,作用域是在代码书写时确定的
var value = 1;
function foo() {
console.log(value);
}
function bar() {
var value = 2;
foo();
}
bar();
//1
输出是1,函数在哪里调用没有关系,变量的位置在编译的词法分析阶段就确定了。
当调用foo时,会对value进行一次RHS查询,在当前函数作用域中没有查找到会查找到最外层的作用域,也就是全局作用域定义的value。
二、修改词法作用域
在代码书写时,作用域(词法作用域)就已经确定了,但是可不可以再修改呢?
通过eval和with都可以用来修改词法作用域。
eval:
function foo(str, a) {
eval(str)
console.log(a, b)//1,3
}
var b = 2;
foo("val b = 3", 1)
with:
用来重复引用同一个对象中的多个属性的快捷方式
可以理解为修改对象中多个属性的值的快捷方式
function foo(obj) {
with(obj) {
a = 7
}
}
var obj1 = {
a: 2
}
var obj2 = {
b: 3
}
foo(obj1)
console.log(obj1)// {a=7}
console.log(a) //7
foo(obj2)
console.log(obj2)//{b:3}
console.log(a)//7
with可以定义一个词法作用域, 值得注意的是with中定义的a=2会在全局作用域中包含一个a变量。
三、函数作用域和块作用域
1、创建作用域的方式
a)通过函数创建局部作用域
1、通过函数声明的方式创建
2、通过函数表达式创建:
匿名函数表达式和具名函数表达式
区别函数表达式和函数声明的方式就是看声明的第一个关键字是否是function开头
b)通过with、try...catch、let和const创建块作用域
值得提的是let和const定义的块作用域
let在声明变量时,会将变量附加在一个已经存在的块作用域上,一般是{}(隐式附加),let声明的变量是在js运行的时候才存在的。
Javascript中的词法作用域、动态作用域、函数作用域和块作用域(四)的更多相关文章
- 博文推荐】Javascript中bind、call、apply函数用法
[博文推荐]Javascript中bind.call.apply函数用法 2015-03-02 09:22 菜鸟浮出水 51CTO博客 字号:T | T 最近一直在用 js 写游戏服务器,我也接触 j ...
- JavaScript闭包理解【关键字:普通函数、变量访问作用域、闭包、解决获取元素标签索引】
一.闭包(Closure)模糊概述 之前总觉得闭包(Closure)很抽象而且难理解,百度一下"闭包"名词,百度的解释是:“闭包是指可以包含自由(未绑定到特定对象)变量的代 ...
- JavaScript中的事件循环机制跟函数柯里化
一.事件循环机制的理解 test();//按秒输出5个5 function test() { for (var i = 0; i < 5; i++) { setTimeout(() => ...
- Javascript中call、apply、bind函数
javascript在函数创建的时候除了自己定义的参数外还会自动新增this和arguments两个参数 javascript中函数也是对象,call.apply.bind函数就是函数中的三个函数,这 ...
- JavaScript中以构造函数的方式调用函数
转自:http://www.cnblogs.com/Saints/p/6012188.html 构造器函数(Constructor functions)的定义和任何其它函数一样,我们可以使用函数声明. ...
- JavaScript中的bind,call和apply函数的用法和区别
一直没怎么使用过JavaScript中的bind,call和apply, 今天看到一篇比较好的文章,觉得讲的比较透彻,所以记录和总结如下 首先要理解的第一个概念,JavaScript中函数调用的方式, ...
- JavaScript中bind、call、apply函数用法详解
在给我们项目组的其他程序介绍 js 的时候,我准备了很多的内容,但看起来效果不大,果然光讲还是不行的,必须动手.前几天有人问我关于代码里 call() 函数的用法,我让他去看书,这里推荐用js 写服务 ...
- JavaScript 中有关Array操作的一些函数
JavaScript的Array可以包含任意数据类型,并通过索引来访问每个元素. 要取得Array的长度,直接访问length属性: var arr = [1, 0.222, 'Hi', null, ...
- JavaScript中bind、call、apply函数使用方法具体解释
在给我们项目组的其它程序介绍 js 的时候,我准备了非常多的内容,但看起来效果不大,果然光讲还是不行的,必须动手. 前几天有人问我关于代码里 call() 函数的使用方法.我让他去看书,这里推荐用js ...
随机推荐
- C4-ResNet-TF-小象cv-code
https://blog.csdn.net/chaipp0607/article/details/75577305 https://blog.csdn.net/leastsq/article/deta ...
- Codeforces 978E:Bus Video System
题目链接:http://codeforces.com/problemset/problem/978/E 题意 一辆公交车,在每站会上一些人或下一些人,车的最大容量为w,问初始车上可能有的乘客的情况数. ...
- SkyWalking+SkyApm-dotnet分布式链路追踪系统
SkyWalking+SkyApm-dotnet分布式链路追踪系统 对于普通系统或者服务来说,一般通过打日志来进行埋点,然后再通过elk或splunk进行定位及分析问题,更有甚者直接远程服务器,直接操 ...
- java-多态中成员访问特点-父类引用指向子类对象
多态前提: - 要有继承关系. - 要有方法重写. - 要有父类引用指向子类对象. 1.成员变量:编译看左边(父类),运行看左边(父类) 2.成员方法:编译看左边(父类),运行看右边(子类),动态绑定 ...
- java-代码块-局部代码块、构造代码块、静态代码块
1.代码块概述: 在Java中,使用{ }括起来的代码被称为代码块. 2.代码块分类: 根据其位置和声明的不同,可以分为局部代码块,构造代码块.静态代码块和同步代码块(多线程). 3.常见代码块的应用 ...
- C++学习(十二)(C语言部分)之 循环
上期回顾:分支if else switch 三目运算符 格式:if(条件){语句1:}else{语句2:} switch (变量){default:break;case 常量1:语句1 ;break; ...
- 4.input()
>>> help(input) Help on built-in function input in module builtins: input(prompt=None, /) R ...
- LeetCode - Top K Frequent Words
Given a non-empty list of words, return the k most frequent elements. Your answer should be sorted b ...
- java中的Object类和其clone()
1.Object是所有类的父类,任何类都默认继承Object,即直接或间接的继承java.lang.Object类.由于所有的类都继承在Object类,因此省略了extends Object关键字. ...
- About the test in development
Unit test: Specify and test one point of the contract of single method of a class. This should have ...