JS作用域理解(声明提升)
1.JS解析步骤:
a.预解析
将变量声明提升;
将函数声明及函数内容提升,可以理解成原来位置的函数在解析代码时已经提到代码初始位置;
块内的变量声明和函数声明也会被提升,例如if语句
遇到重名,只留下一个;
如有重名变量和函数,留下函数;
如有两个重名函数,后一个函数覆盖前一个函数;
firefox不能预解析块内定义的函数,出于兼容性考虑,定义函数,一般要放到最外面
(注意:变量提升的是声明,函数提升的是声明和内容)
b.逐行解析代码
遇到表达式,可以修改预解析的变量值,例如变量赋值可以将函数声明替换掉;
(重点)先处理js代码,再处理代码中的事件和队列,例如,先将setTimeout解析出来,等代码执行完,再根据延时处理其中的函数
2.如果有几个script代码部分,JS会按照先后顺序逐个解析执行,但是这几个代码部分共用一个域
3.函数的参数相当于在函数内部定义了这个变量,相当于局部变量,在函数内部解析时也会进行声明提升
4.JS中,每个函数都有自己的执行环境(作用域),其中使用的变量会按照作用域链进行搜索,一直到全局环境,并且只会对目标变量所处的环境造成影响
5.被花括号包围的代码块在很多类c语言中会有块级作用域,JS没有块级作用域
6.函数传参相当于赋值表达式
7.只要是一个执行环境(作用域),就会发生JS解析两个步骤
8.只有函数可以创建局部作用域,如果需要一个类似块级作用域的作用域,可以在块内加入一个函数
例子:
alert(a); // function a (){ alert(4); }
var a = 1;
alert(a); // 1
function a (){ alert(2);
alert(a); // 1
var a = 3;
alert(a); // 3
function a (){ alert(4); }
alert(a); // 3
alert( typeof a );
a(); // 报错
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<script>
alert(a); //报错
</script>
<script>
var a=1;
</script>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<script>
var a=1
</script>
<script>
alert(a); //1
</script>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
var a = 1;
function fn1(){
alert(a); // undefined
var a = 2;
}
fn1();
alert(a); // 1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
var a = 1;
function fn1(){
alert(a); // 1
a = 2;
}
fn1();
alert(a); // 2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
var a = 1;
function fn1(a){
alert(a); // undefined
a = 2;
}
fn1();
alert(a); // 1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
var a = 1;
function fn1(a){
alert(a); // 1
a = 2;
}
fn1(a);
alert(a); // 1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
window.onload = function (){
var aBtn = document.getElementsByTagName('input');
for( var i=0; i<aBtn.length; i++ ){
aBtn[i].onclick = function (){
// alert( i ); // Undefined
for( var i=0; i<aBtn.length; i++ ){
aBtn[i].style.background = 'yellow';
}
};
}
};
JS作用域理解(声明提升)的更多相关文章
- 一个经典的js中关于块级作用域和声明提升的问题
function functions(flag) { if (flag) { function getValue() { return 'a'; } } else { function getValu ...
- JS作用域理解
1.JS解析步骤: a.预解析 将变量声明提升: 将函数声明及函数内容提升,可以理解成原来位置的函数在解析代码时已经提到代码初始位置: 遇到重名,只留下一个: 如有重名变量和函数,留下函数: 如有两个 ...
- JS作用域、变量提升和闭包
作用域 作用域可以理解为JS引擎执行代码的时候,查找变量的规则. 从确定变量访问范围的阶段的角度,可以分为2类,词法作用域和动态作用域.js是词法作用域. 从变量查找的范围的角度,可以分为3类,全局作 ...
- JS 作用域与变量提升---JS 学习笔记(三)
你知道下面的JavaScript代码执行时会输出什么吗? var foo = 1; function bar() { if (!foo) { var foo = 10; } console.log(f ...
- JS作用域和变量提升看这一篇就够了
作用域是JS中一个很基础但是很重要的概念,面试中也经常出现,本文会详细深入的讲解这个概念及其他相关的概念,包括声明提升,块级作用域,作用域链及作用域链延长等问题. 什么是作用域 第一个问题就是我们要弄 ...
- JavaScript 变量作用域和声明提升
一.变量作用域 说到这个概念,不有自主的想到this,scope 这两个关键字. JavaScript的this总是指向一个明确的对象,这个对象是在执行的时候动态绑定的.通俗的说就是谁调用我,我的th ...
- js 作用域,变量提升
先看下面一段代码: 代码执行的结果是: 1st alert : a = 0 2nd alert : a = undefined 5th alert : a = 0 3rd alert : a = 3 ...
- js作用域和变量提升
Function declarations and variable declarations are always moved (“hoisted”) invisibly to the top of ...
- JS中作用域和变量提升(hoisting)的深入理解
作用域(Scoping) javascript作用域之所以迷惑,是因为它程序语法本身长的像C家族的语言.我对作用域的理解是只会对某个范围产生作用,而不会对外产生影响的封闭空间.在这样的一些空间里,外部 ...
随机推荐
- python接口自动化22-签名(signature)鉴权(authentication)之加密(HEX、MD5、HMAC-SHA256)
前言 开放的接口为了避免被别人乱调用,浪费服务器资源,这就涉及到签名(Signature)加密了 API 使用签名方法(Signature)对接口进行鉴权(Authentication).每一次请求都 ...
- JavaScript笔记——使用AJax
在使用过JQuery之后,再来看JavaScript的Ajax实现就会觉得很麻烦,不过,最近使用到了,就记录一下吧 在JavaScript中Ajax的实现可以分为四步: 第一步 得到XMLHttpRe ...
- HBase快速上手
一.创建单节点HBase实例 https://hbase.apache.org/book.html#quickstart (一)jdk版本要求Java: HBase Version JDK 7 JDK ...
- Crawlspider的自动爬取
引子 : 如果想要爬取 糗事百科 的全栈数据的方法 ? 方法一 : 基于scrapy框架中的scrapy的递归爬取进行实现(requests模块递归回调parse方法) . 方法二 : 基于Crawl ...
- excel之工作表工作簿保护暴力撤销
excal之工作表工作簿保护暴力撤销 excel可以在审阅中设置工作表.工作簿的密码保护,但是当密码忘记或一些特殊情况下需要进行操作. 1.工作簿保护撤销 步骤一:将需要破解的excal文件后缀名改为 ...
- 基本SQL命令 (1.SQL命令使用规则/2.库管理/3.表管理/4.表记录管理/5.更改库,库的默认字符集/6.连接数据库的过程/7.数据类型)
1.SQL命令的使用规则 1.每条命令必须以 ; 结尾 2.SQL命令不区分字母大小写 3.使用 \c 终止SQL命令的执行 2.库的管理 1.库的基本操作 ...
- windows共享连接显示无法打开
Ping目标地址和名称可以连通,但是访问告知无法打开或找到名称,看凭据设置正常,重启无效. 判断:可能是由于凭据过期引起,更新凭据,重启,仍旧无效. 修改IP地址进行访问,成功打开. 清理网络连接状态 ...
- 给虚拟机添加eth1网络适配器(网卡)
1.虚拟机 -- > 设置 2.添加 --> 网络适配器 --> 下一步 3.主机 -- > 完成 -- > 确定 4.修改网卡的配置文件 cd /etc/sysconf ...
- 关于junit包导入不了但是maven本地库中却存在的问题
导入项目的时候发现junit的类使用不了,于是就去看看包导入了没有 发现包是灰色的,于是猜想可能是maven本地库中包没下载过来 查询了本地库发现包是存在的,这就奇怪的,经过网上查询之后得到解决方案 ...
- tomcat https
转自 http://11lingxian.iteye.com/blog/1491607 双向认证: 客户端向服务器发送消息,首先把消息用客户端证书加密然后连同时把客户端证书一起发送到服务器端, 服务器 ...