JavaScript中变量、参数、函数之间的关系
——————————————————————————————
废话不多说,直接开始。
我们看一段代码(参考其他资料所得)
<script type="text/javascript">
function a(b){
console.log(b);
function b(){
console.log(b);
}
}
a(1);
</script>
运行结果是什么呢?请各位读者先不要运行代码,先思考一下猜猜结果。
——————————————————————————————————
不管你想的结果是几个,不管你想的结果是不是1,唯一结果是:
function b(){
console.log(b);
}
是的,结果很以外(大神们请忽视我们这些小白),那为什么会出现这样的结果呢?我们来根据结果逆推分析一下。
首先分析这段代码:
1.创建函数a(b),传递的参数是b,
2. 输出b,
3.a函数里面在输出b后声明一个函数b(),这个b()函数内容是输出b,
4.调用函数a(1),传递1.
然后分析代码的运行:
1、这个输出是哪一行的呢?这段代码运行时只调用了a()函数,b()函数只是声明而没有调用,所以这个输出是函数a()里面的输出,即第一个confole.log(b);
2、既然知道了输出语句,就分析输出内容,很明显输出的是b
3、根据输出结果,这个b不是传递过来的参数b(调用时是1),而是a()函数里面声明的子函数function b(),
4、传递的参数失效了
总上分析,我们好像明白了一点,在函数a()里面,子函数声明的优先级(暂且这样说)好像比参数的高啊
所以,虽然调用a()时传递了1给b,但是有立刻将b()函数给了变量b,执行后就输出了function b()函数。
拓展:
通过以上的案例,并查询其他资料,我总结一下函数中内部执行流程。
一段代码写完后到运行结束,分为两个时期(我虽然学过编译原理,但是跟没学一样,所以不会用词):读、运行。
1、读一段代码时,只管变量和函数的声明,不管赋值,比如 var a=3;只知道有个变量叫a,值不管。
2、运行代码时,比如调用函数a(1),传递参数1给形参b,之后并不执行cosole.log()函数,而是继续找子函数声明,于是找到了函数function b(),这个函数赋值给变量b
3、读完了,到了运行代码,运行console.log(b),自然输出了function b()。
可能我的知识不足,上面涉及到的我只能这样说了,以后有机会了好好研究研究。
欢迎大家批评指正哈。
JavaScript中变量、参数、函数之间的关系的更多相关文章
- JavaScript中变量和函数声明的提升
现象: 1.在JavaScript中变量和函数的声明会提升到最顶部执行. 2.函数的提升高于变量的提升. 3.函数内部如果用var声明了相同名称的外部变量,函数将不再向上寻找. 4.匿名函数不会提升. ...
- 关于javascript中变量及函数的提升
javascript中变量以及函数的提升,在我们平时的项目中其实还是挺常用的,尤其是大型项目中,不知不觉就会顺手添加一些变量,而有时候自己的不小心就会酿成一些不必要错误,趁有时间整理一下自己对于js中 ...
- C#与Javascript变量、函数之间的相互调用
原文地址:http://blog.csdn.net/wonsoft/article/details/2595743 C#与Javascript变量.函数之间的相互调用 一.javascript调用C ...
- C语言中变量和函数的作用域和链接属性
C语言中变量和函数的作用域和链接属性 作用域 代码块作用域: 代码块指的是使用"{}"包围起来的部分. 在代码块中定义的变量,代码块之外是不能访问的. 代码块嵌套之后的变量作用域, ...
- 理解与使用Javascript中的回调函数 -2
在javascript中回调函数非常重要,它们几乎无处不在.像其他更加传统的编程语言都有回调函数概念,但是非常奇怪的是,完完整整谈论回调函数的在线教程比较少,倒是有一堆关于call()和apply() ...
- 前端学习 第二弹: JavaScript中的一些函数与对象(1)
前端学习 第二弹: JavaScript中的一些函数与对象(1) 1.apply与call函数 每个函数都包含两个非继承而来的方法:apply()和call(). 他们的用途相同,都是在特定的作用域中 ...
- 理解和使用 JavaScript 中的回调函数
理解和使用 JavaScript 中的回调函数 标签: 回调函数指针js 2014-11-25 01:20 11506人阅读 评论(4) 收藏 举报 分类: JavaScript(4) 目录( ...
- JavaScript 中变量、作用域和内存问题的学习
这是我学习JavaScript的第二篇文章,之前做过几年的Java开发,发现JavaScript虽然也是面向对象的语言但是确实有很多不同之处.就本篇博客,主要学习总结一下最近学习到的JavaScrip ...
- JavaScript中变量声明有var和没var的区别
JavaScript中变量声明有var和没var的区别 JavaScript中有var和没var的区别 Js中的变量声明的作用域是以函数为单位,所以我们经常见到避免全局变量污染的方法是 (functi ...
- 在 JavaScript 中使用构造器函数模拟类
今天,我们要讲的是在 JavaScript 中使用构造器函数(construcor function)模拟类. 构造器函数简介 你可以使用 ES6 的 class 关键字来实现类,不过我建议你使用传统 ...
随机推荐
- 无线同步模块SYN1000在电力监测相位测量领域的应用方案
在电力监测领域,出于安全考虑,有些系统不得不采用无线通信的方式,在这样一个无线通信的应用系统,该如何来控制多个设备进行同步采样,以期提高相位角的测量精度,是一个不小的难题. 很多技术人员习惯性的采用无 ...
- js应用之实现图片切换效果
数组的操作与应用 数组的定义 var 数组名=new Array(); //创建空数组 var 数组名=new Array(size);//创建指定数组长度的数组 var 数组名=new Array( ...
- jsp页面中从forEach里向action里面传递其中的一个对象
<c:forEach var="user" items="${users }"> <form action="user_update ...
- 自适应滤波——线性预测(LPC)
作者:桂. 时间:2017-03-26 10:12:07 链接:http://www.cnblogs.com/xingshansi/p/6621914.html 声明:欢迎被转载,不过记得注明出处哦 ...
- [.NET] 一步步打造一个简单的 MVC 网站 - BooksStore(一)
一步步打造一个简单的 MVC 网站 - BooksStore(一) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore 简介 主 ...
- 当在浏览器地址栏里输入URL后会发生什么事情
其实这个很多大神已经说的很多了.但是为了自己更好的理解,在自己所接触的层面上,重新对自己讲解一下.当然,这是站在一个前端开发者的角度上来看问题的. 说说一次HTTP完整事务的过程 输入URL 浏览器从 ...
- Appium 解决锁屏截屏问题(java篇)
今天有个小伙伴问我,怎么把锁屏进行解锁操作? A.思路在初始化driver后,加入等待判断是否有锁屏(元素)(记得要加入等待) B.如果有就进行解锁,就一般的输入数字密码然后进行解锁(当然了你要知 ...
- JAVA优化建议
前言 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用, ...
- 老李分享:loadrunner操作mysql数据库
老李分享:loadrunner操作mysql数据库 在poptest测试开发工程师就业培训的课程中,针对一套商业系统进行性能测试,目标是mysql后台数据库的负载能力,在这里我把测试代码 ...
- Angularjs 实现移动端在线测评效果
注:此文所用的angular版本为 1.6 一.运行效果图 二.需求 1. 点击选项时,背景变为黄色(即选中状态),并且自动切换到下一题 2. 切换到下一题时,顶部进度随之改变 3. 选中时要把对应的 ...