var a = 1;
function a() { console.log(a); }; a();
这几行JS代码运行会报错,但是原因是什么?求大神讲解
函数做为javascript的第一公民,所以在此处存在函数提升。上述代码最后的实现和以下效果是一样的
function a() { console.log(a); }; var a = 1; a();
这样会导致原有的函数名被覆盖。
标识符重复了啊 你已经给a声明成一个变量了
首先说一点 js 看到 var a = 1 是 分两步来解析,第一 把var a 提升到当前作用域顶端,然后依次往下解析,知道a = 1 开始赋值
这就是 变量 跟 函数重名的问题, 简单来说 js引擎解析顺序是这样的 1.变量个函数声明提升到当前作用域顶端 → var a ↑ 和 `function a(){
console.log(a);
}`2.然后解析剩下的代码 `a=1;a()`,
这是因为函数声明会提前
var a = 1; function a() { console.log(a); }; a();
1)函数声明会置顶2)变量声明也会置顶3)函数声明比变量声明更置顶:(函数在变量上面)4)变量和赋值语句一起书写,在js引擎解析时,会将其拆成声明和赋值2部分,声明置顶,赋值保留在原来位置5)声明过的变量不会重复声明
就会相当于下面的这个样子
var a = function () { console.log(a); }; var a = 1; a();
希望帮到你~
很多人都提到了是变量提升的问题,但解释的不太对。var提升是拆开来提升的,函数是整个提升的。FYI
var
所以应该是这个样子:
var a; function a () { console.log(a); }; a = 1; a();
函数做为javascript的第一公民,所以在此处存在函数提升。上述代码最后的实现和以下效果是一样的
这样会导致原有的函数名被覆盖。
标识符重复了啊 你已经给a声明成一个变量了
首先说一点 js 看到 var a = 1 是 分两步来解析,第一 把var a 提升到当前作用域顶端,然后依次往下解析,知道a = 1 开始赋值
这就是 变量 跟 函数重名的问题, 简单来说 js引擎解析顺序是这样的
1.变量个函数声明提升到当前作用域顶端 → var a ↑ 和 `function a()
{
}`
2.然后解析剩下的代码 `a=1;
a()`,
这是因为函数声明会提前
1)函数声明会置顶
2)变量声明也会置顶
3)函数声明比变量声明更置顶:(函数在变量上面)
4)变量和赋值语句一起书写,在js引擎解析时,会将其拆成声明和赋值2部分,声明置顶,赋值保留在原来位置
5)声明过的变量不会重复声明
就会相当于下面的这个样子
希望帮到你~
很多人都提到了是变量提升的问题,但解释的不太对。
var
提升是拆开来提升的,函数是整个提升的。FYI所以应该是这个样子: