js变量提升小记
作为世界上最优美的语言javascript的使用者,呵呵,js的魅力是无穷的,今天来聊聊他的魅(dan)力(teng)之一,变量提升。
每种语言所定义的变量基本都会有一定得作用域,而js的作用域则存在着一定的陷阱。首先看一下下面一道题:
<script>
var str1 = "haha";
var str2 = "hehe"; function t1() {
console.log(str1);
console.log(str2); var str2 = "kidding";
console.log(str2);
} t1(); </script>
结果是:
haha
undefine
kidding
纳尼?hehe哪去了?结果不应该是:haha hehe kidding吗?
实际上这里就有一个变量提升的问题。如果函数写成这样,你可能就一目了然了
<script>
var str1 = "haha";
var str2 = "hehe"; function t1() {
var str2;
console.log(str1);
console.log(str2); str2 = "kidding";
console.log(str2);
} t1();
</script>
实际上js在解析的时候正是按照这样的执行顺序进行的,在执行到t1内部的时候,会优先找到函数内部作用域里的变量执行,而且函数内的所有var 声明function声明都会被提到函数体的最上方执行。并且var 声明会先声明之后,执行到赋值的时候再赋值。
再看下面的例子:
<script>
function t(userName) {
console.log(userName); function userName() {
console.log('tom');
}
}
t('toby');
</script>
由于function声明会被提前到函数体最上方,所以相当于这样:
function t(userName) {
function userName() {
console.log('tom');
}
console.log(userName);
}
t('toby');
结果很明显是:
function userName(){
console.log('tom');
}
但是像下面这样的函数表达式,则会把var t2进行提升,而后再对t2进行赋值
<script>
test(); var test = function () {
console.log('hello toby');//这里会输出什么?
};
</script>
解析后变成:
<script>
var test ;
test(); test = function () {
console.log('hello toby');//这里会输出什么?
};
</script>
由于执行到test()的时候,test还是一个undefine所以代码会报错。
但是变量提升只是在该变量在改作用域内从未出现的时候才会发生。看下面的题:
<script>
function t(userName) {
console.log(userName);// (1)
var userName = function () {
console.log(userName);//(2)
}
userName();//(3)
}
t('haha');
</script>
如果按照刚才所说的变量提升,可能会认为结果是:
(1) 处为undefine
(2)处是
function () {
console.log(userName);//(2)
}
实际上结果是:(1)处输出的是haha ,原因在于执行到t函数内部的时候,userName这个变量在传参的时候在这个内部作用于内已经存在了,所以不会进行变量提升,而是直接使用已经
存在的userName='haha'。(2)执行(3)的时候userName就是一个function了,所以(2)处的结果就一目了然了。 自己的一番拙见,如有不对,还望指出。
参考链接:http://www.jianshu.com/p/43bf4f2e0d57?from=singlemessage
js变量提升小记的更多相关文章
- js 变量提升+方法提升
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- JS 变量提升与函数提升
JS 变量提升与函数提升 JS变量提升 变量提升是指:使用var声明变量时,JS会将变量提升到所处作用域的顶部.举个简单的例子: 示例1 console.log(foo); // undefined ...
- js变量提升与函数提升的详细过程
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
- JS变量提升和作用域
一.JS变量提升 1.当浏览器引擎解析js代码时,将js中的所有一开始就是var声明的和function声明的都提升到全局.此时又叫全局作用域 console.log(aa); console.log ...
- js变量提升的坑
关于js变量提升 变量提升 在js函数内部是可以直接修改全局的变量的,个人感觉是不好的设计, 但是确实存在这个概念 原理: 先查看有没有函数变量bb 查看形参有没有bb 查看全局有没有bb 报错, 找 ...
- js 变量提升和函数提升原理
关于js的变量,开始的时候我们都会被告知,变量声明应该在引用该变量之前.关于为什么要这样做呢,开始的时候本着会用就行的目的,也没去深究.不过后来经常会发现一些让人很费解的..姑且称为现象吧.先看一段代 ...
- 关于JS变量提升的一些坑
function log(str) { // 本篇文章所有的打印都将调用此方法 console.log(str); } 函数声明和变量声明总是会被解释器悄悄地被“提升”到方法体的最顶部 变量声明.命名 ...
- JS 变量提升
var a = 1; function foo() { console.log(a); var a = 2; } foo(); //undefined 根据变量提升机制,最后得出undefined; ...
- js变量提升与函数提升
在es6之前,js语言并没有块级作用域,即{}形成的作用域,只有全局作用域和函数作用域,所谓的提升,即是将该变量的声明或者函数的声明提升,举个例子 console.log(global); //und ...
随机推荐
- mysql千万级数据表,创建表及字段扩展的几条建议
一:概述 当我们设计一个系统时,需要考虑到系统的运行一段时间后,表里数据量大约有多少,如果在初期,就能估算到某几张表数据量非常庞大时(比如聊天消息表),就要把表创建好,这篇文章从创建表,增加数据,以及 ...
- 多线程编程学习笔记——async和await(三)
接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五. 处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...
- DotNetCore跨平台~Moq框架实现模拟测试
回到目录 当我们进行软件开发时,一般会写单元测试,而对于业务情景来说,一般是测试它的业务逻辑准确性,对于你的测试数据是否来自数据库还是文件,是否为真实还是模拟,并不是很关心!我关心的就是我的业务逻辑是 ...
- 【python】lambda创建匿名函数
- 解决IOS iframe不滚动问题
.frameBox{ position: fixed; top: 0; left: 0; right: 0; bottom: 0; -webkit-overflow-scrolling: touch; ...
- kvm 随笔
1. 查看kvm虚拟机状态 # virsh list --all 2. KVM虚拟机开机 # virsh start windows 3. KVM虚拟机关机或断电 (1) 关机 virsh关机 ...
- Java 集成 速卖通开发.
一.申请成为开发者 申请入口:http://isvhz.aliexpress.com/isv/index.htm 说明文档:http://activities.aliexpress.com/open/ ...
- tesserat训练中文备忘录
最近用OCR识别身份证,用的tesseract引擎.但是google自带的中文库是在太慢了,尤其是对于性别.民族这样结果可以穷举的特征信息而言,完全可以自己训练字库.自己训练字库不仅可以提高识别速度, ...
- Linux 运行级别
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/47 运行级别 不同运行级别的描述 运行级别0:系统停机状态,系统 ...
- webpack 理解
目录 关于此文 在学习webpack之前,我们先去了解它的作用 它与其他其他前端工具(gulp,grunt)有什么差别呢 安装 webpack.config.js 配置结果 webpack 开始简单配 ...