JS变量名和函数名的提升
来源:互联网 发布:截面数据要做哪些检验 编辑:程序博客网 时间:2024/05/16 17:12
要点)函数声明是函数的声明和实现都被提升了。
函数表达式和变量表达式只是其声明被提升了。
今天有个朋友问了一个问题:
这个结果打印出来是:a 不是一个函数。
当我看到这个的时候,我第一个想到变量名和函数名一样,有冲突然。所以我把变量名和函数名设置成不一样。
那么其实存在一个问题,函数名和变量名的提升问题。
这个是同事告诉我的,变量名提升的问题。
分析如下:
一个变量的作用域是程序源码中定义的这个变量的区域。
全局变量拥有全局作用域,可以定义在 js中的任何地方都有定义。
局部变量拥有局部作用域,在函数内部定义。
在函数体内,局部变量的优先级高于全局变量。如果在函数体内申明一个变量与局部变量重名,则会覆盖原先的局部变量。
从第一个模块看出:
局部变量的作用域仅仅在函数内部,出了函数体之后,局部变量就会被销毁。
在nested()函数中,虽然又声明了一个scope,但是nested()中的scope是局部变量,只是与全局变量的名字相同,并不是全局变量,所以,虽然在该函数中把scope赋值为”嵌套作用域内的局部变量”,但这仅仅是一个与全局变量名称相同的一个变量而已,并没有改变全局变量的值。
第二个模块看出:
看到这里是不是有一些懵逼了,这和刚才不是一样的吗,为什么第二次弹框不一样了呢?
上面这部分代码中,在nested()函数中,我们并没有用var来声明scope,所以,在这里的scope的作用域就被提升了,即我们将checkscope中的scope的值重置了,所以在输出的时候输出的结果为嵌套作用域内的局部变量。
函数表达式和变量表达式只是其声明被提升,函数声明是函数的声明和实现都被提升。
一、变量提升
在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域 和 函数作用域。
变量提升即将变量声明提升到它所在作用域的最开始的部分。下面举个简单的例子
由于js的变量提升,实际上上面的代码是按照 2 执行的。
二、函数提升
js中创建函数有两种方式:函数声明式和函数字面量式。只有函数声明才存在函数提升!
下面一个例子进行分析:
可以解析成:
阅读全文
0 0
- JS变量名和函数名的提升
- js 变量 函数名的提升
- 不一致的变量名和函数名
- JS中变量名和函数名重名
- js中的变量名和函数名重名问题
- js的变量提升和函数提升
- js的变量提升和函数提升
- JS变量名、函数名,区分大小写
- 13、函数名和变量名的命名
- 变量名、函数名
- js函数名和带()的区别
- 在JS中如果函数名与变量名冲突,JS是怎么执行的?
- js中避免函数名和变量名跟别人冲突(1)
- js中避免函数名和变量名跟别人冲突
- 深入理解js的变量提升和函数提升
- 深入理解js的变量提升和函数提升
- 深入理解js的变量提升和函数提升
- 关于js函数 形参和局部变量名相同 的问题
- JAVA中创建JDBC以及对jdbc的封装(数据库为mysql)
- 编写程序STUDENT *Create(STUDENT studs[],int n)。 STUDENT是一个结构类型,包含姓名、成绩和指针域。
- CSU 1592:石子归并(区间DP)
- Scanner的next()和nextLine()的区别
- 常用对象 以及使用方法
- JS变量名和函数名的提升
- JDBC数据库连接
- 1.17.ARM汇编指令集5之乘法指令
- POJ2478 Farey Sequence
- ----- UVA 11624-Fire!
- windows 如何定时更新svn
- Maven仓库镜像
- 二叉树的基本应用及其他
- 2017 Multi-University Training Contest