javascript函数中变量重名
<script type="text/javascript">
function fun(a){
console.log(a); // function var a=11;
function a(){
return 22;
} console.log(a); //
}
fun(33);
</script>
问题1:为什么第1个会输出 function呢,为什么不是实参33呢?
问题2:函数内部变量和函数在”预编译“的时候究竟是怎么样的呢?
问题3:var a=11;这个变量声明和函数名称相同了怎么处理?
首先是”预编译“过程中,函数体内部 变量和函数声明会被提到最先执行,变量在没有赋值时为undefined,那么函数呢?有人说函数声明时,声明和赋值一起完成了。
<script type="text/javascript">
console.log(ask);// function ask
var ask=12;
function ask(){
alert("111");
}
console.log(ask);// 12
</script>
上面这段代码说明一个问题,变量名和函数名同名的情况下,其实只声明了一个变量。函数声明后就赋值了,所以第1个log的时候,会是函数。也就是他们说的优先级,函数>局部变量。可以这样理解,假如函数声明先执行,那么var ask=12;就不再是声明变量了,只是给变量重新赋个值。假如变量声明先执行,那么ask暂时=undefined,后边函数声明的时候直接就想变量的undefined变成了函数。
<script type="text/javascript">
function fun(a){
console.log(a);//
var a=11;
console.log(a);//
}
fun(33);
</script>
上面这段代码,第一个log为33。如果var a=11;是变量声明并赋值的话,我们知道log的时候a=undefined,说明此处var a=11不是声明而仅仅是简单的赋值。
再来个例子:
<script type="text/javascript">
function fun(a){
console.log(a);//
var a;
console.log(a);//
}
fun(33);
</script>
这也说明var a;不再是声明了,因为形参中a早就声明了。上面两段代码得出一个结论:函数形参和函数局部变量同名的话,其实只是一个变量。形参是声明,内部变量前加了var 同样只是赋值。
所以这道题,从头到尾只有1个局部变量。最开始a==33,进入函数后a变成了function ,最后a 变成了11。感谢TX同学一开始就说的 内部function》内部变量》参数
javascript函数中变量重名的更多相关文章
- 规避Javascript多人开发函数和变量重名问题
函数和变量重名始终是一个令人头痛的问题,先讲变量吧,相信了解JS的朋友都知道,在JS中 是没有块级作用域的只有函数作用域,也就是说那些以大括号为界定符的代码块是管不住其中定义 的变量的作用域的,举例: ...
- C++ 类的继承四(类继承中的重名成员)
//类继承中的重名成员 #include<iostream> using namespace std; /* 自己猜想: 对于子类中的与父类重名的成员,c++编译器会单独为子类的这个成员变 ...
- 浅谈javascript函数,变量声明及作用域
javascript函数跟变量的声明.作用域这些概念网上都已经讲烂了. 这里写个博客,也相当于做个笔记. 变量声明 首先看个例子: var globalVar = "gv"; fu ...
- linker command failed with exit code 1 (use -v to see invocation) 变量重名
有时候,xcode报错看不到,点最后一个按钮,类似气泡的就能看到 报错信息: duplicate symbol _imgNummmm in: /Users/mianmian/Library/De ...
- c++中的重名问题
看C++视频教程-范磊主讲(2.91G)视频学习笔记整理. 1.c++为什么要引入名字空间(namespace)? c++引入名字空间这个概念,是为了避免重名问题,比如说避免重复的函数名或者变量名引起 ...
- javascript函数中的三个技巧【三】
技巧三: [函数绑定] 在javascript与DOM交互中经常需要使用函数绑定,定义一个函数然后将其绑定到特定DOM元素或集合的某个事件触发程序上,绑定函数经常和回调函数及事件处理程序一起使用,以便 ...
- delphi with... do和自定义变量重名
with类中的变量和外部变量如果重名,会将外部变量覆盖,这点需要注意!!!!!
- JavaScript函数中的参数(arguments)
arguments argument是JavaScript中的一个关键字,用于指向调用者传入的所有参数. function example(x){ alert(x); alert(arguments. ...
- 多测师讲解python _函数中变量_高级讲师肖sir
定义的函数内部的变量名如果是第一次出现, 且在=符号前,那么就可以认为是 被定义为局部变量.在这种情况下,不论全局变量中是否用到该变量名,函数中 使用的都是局部变量.例如: num=100 #全局变量 ...
随机推荐
- linux压缩解压文件
首先进入文件夹 cd /home/ftp2/1520/web 压缩方法一:压缩web下的888.com网站 zip -r 888.com.zip888.com 压缩方法二:将当前目录下的所有文件和文件 ...
- 关于scrolltop 兼容 IE6/7/8, Safari,FF的方法
1.各浏览器下 scrollTop的差异IE6/7/8:对于没有doctype声明的页面里可以使用 document.body.scrollTop 来获取 scrollTop高度 :对于有docty ...
- 记账类APP竞品分析-挖财与随手记
注:本文更新中. 一.概览 1. 产品名称及版本 l 挖财11.2.0.0 免费版(2016/9/6发布) l 随手记10.2.8免费版(2016/8/22发布) 2. 设备信息 设备型号:i ...
- React Native的环境搭建以及开发的IDE
(一)前言 前面的课程我们已经对React Native的环境搭建以及开发的IDE做了相关的讲解,今天我们的主要讲解的是应用设备运行(Running)以及调试方法(Debugging).本节的前提条件 ...
- LeakCanary Android 和 Java 内存泄露检测。
开始使用 在 build.gradle 中加入引用,不同的编译使用不同的引用: dependencies { debugCompile 'com.squareup.leakcanary:leakcan ...
- 关于 ant 不同渠道自动打包的笔记
必要的java.android.ant文件及循环打包用到的ant的jar 下载Ant(这里的Ant不是eclipse和android SDk里面自带的ant) 官方下载地址:http://a ...
- JQuery 阻止js事件冒泡 阻止浏览器默认操作
//阻止事件冒泡 event.stopPropagation(); //阻止浏览器默认操作 event.preventDefault(); 代码不一定能执行,写给自己看的. 事件冒泡: <a h ...
- SQL增删改语句常用
创建table: create table tab_name( col1 type; 约束:主键-外键-非空-检查-唯一 col2 type; ); 删除表 : drop table tab_name ...
- 关于u32中查找和定位最后到bit Number of 1 Bits
题目来源: https://leetcode.com/problems/number-of-1-bits/ 刷leetcode的时候发现了这个题目. 作为常年跑底层嵌入式的我,对于这种题目兴趣还是很浓 ...
- Apache虚拟机建立本地域名
Apache虚拟机建立本地域名 1.首先打开conf文件夹下http.conf文件,查找vhost,如下操作 2.删除#(取消注释,启用虚拟机功能),根据红框内路径找到httpd-vhosts.con ...