<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函数中变量重名的更多相关文章

  1. 规避Javascript多人开发函数和变量重名问题

    函数和变量重名始终是一个令人头痛的问题,先讲变量吧,相信了解JS的朋友都知道,在JS中 是没有块级作用域的只有函数作用域,也就是说那些以大括号为界定符的代码块是管不住其中定义 的变量的作用域的,举例: ...

  2. C++ 类的继承四(类继承中的重名成员)

    //类继承中的重名成员 #include<iostream> using namespace std; /* 自己猜想: 对于子类中的与父类重名的成员,c++编译器会单独为子类的这个成员变 ...

  3. 浅谈javascript函数,变量声明及作用域

    javascript函数跟变量的声明.作用域这些概念网上都已经讲烂了. 这里写个博客,也相当于做个笔记. 变量声明 首先看个例子: var globalVar = "gv"; fu ...

  4. linker command failed with exit code 1 (use -v to see invocation) 变量重名

    有时候,xcode报错看不到,点最后一个按钮,类似气泡的就能看到 报错信息: duplicate symbol _imgNummmm in:    /Users/mianmian/Library/De ...

  5. c++中的重名问题

    看C++视频教程-范磊主讲(2.91G)视频学习笔记整理. 1.c++为什么要引入名字空间(namespace)? c++引入名字空间这个概念,是为了避免重名问题,比如说避免重复的函数名或者变量名引起 ...

  6. javascript函数中的三个技巧【三】

    技巧三: [函数绑定] 在javascript与DOM交互中经常需要使用函数绑定,定义一个函数然后将其绑定到特定DOM元素或集合的某个事件触发程序上,绑定函数经常和回调函数及事件处理程序一起使用,以便 ...

  7. delphi with... do和自定义变量重名

    with类中的变量和外部变量如果重名,会将外部变量覆盖,这点需要注意!!!!!

  8. JavaScript函数中的参数(arguments)

    arguments argument是JavaScript中的一个关键字,用于指向调用者传入的所有参数. function example(x){ alert(x); alert(arguments. ...

  9. 多测师讲解python _函数中变量_高级讲师肖sir

    定义的函数内部的变量名如果是第一次出现, 且在=符号前,那么就可以认为是 被定义为局部变量.在这种情况下,不论全局变量中是否用到该变量名,函数中 使用的都是局部变量.例如: num=100 #全局变量 ...

随机推荐

  1. JavaScript 获取数组中最大值、最小值

    笨方法 Array.prototype.max = function() { var max = this[0]; var len = this.length; for (var i = 1; i & ...

  2. python练手项目

    文本操作 逆转字符串--输入一个字符串,将其逆转并输出. 拉丁猪文字游戏--这是一个英语语言游戏.基本规则是将一个英语单词的第一个辅音音素的字母移动到词尾并且加上后缀-ay(譬如"banan ...

  3. js 递归学习

    作用:将一些复制的算法变为简单,比如:(举例子)计算数组 var  a =[1,3,4,6,7,8]的长度:求 5!的值,也可以做搜索用等. //求数组的长度function len(arry){ i ...

  4. find和grep的区别

    find命令:在系统当中搜索符合条件的文件名,如果需要匹配,使用通配符匹配,通配符是完全匹配. grep命令:在文件当中搜索符合条件的字符串,如果需要匹配,使用正侧表达式匹配 正侧表达式是包含匹配.

  5. Git分布式版本管理工具基本使用方法

    一.Git简介 早先linux内核代码托管在BitKeeper,这个是商业的,但是免费给linux社区使用: linux社区有个人试图破解BitKeeper,被BitKeeper发现后不再免费提供使用 ...

  6. dentry与inode有什么联系和区别

    我们在进程中要怎样去描述一个文件呢?我们用目录项(dentry)和索引节点(inode).它们的定义如下: struct dentry {struct inode                    ...

  7. 自建yum源及分组安装

    最近在研究一套自动化运维方向的框架,在想到远程安装软件包的时候,觉得有yum支持会更方便一些.主要思路是把程序员写的代码或程序打包成rpm,然后提交到自建yum源,并实现按组安装,本地yum源实现步骤 ...

  8. linux 并发 RCU

    What is RCU, Fundamentally? https://lwn.net/Articles/262464/ If you can fill the unforgiving secondw ...

  9. Python之路,day3-Python基础

    三级菜单 menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家':{}, ...

  10. int.Parse()、int.TryParse()和Convert.ToInt32()的区别

    1:int.Parse(一个参数)        此参数必须满足: 1 只能是字符串: 2 只能是 “整型” 字符串,即各种整型ToString()之后的形式,也不能为浮点型. 2:int.TryPa ...