起升机构
Javascript的变量声明具有提升机制。当Javascript引擎
执行时,所有变量声明都被提升到当前范围的最前面。
先看一段代码
var;
(
函数(){())
console.log(V);
var;
});
此代码
运行的结果是什么
答案是:未定义
代码的这一部分说明了两个问题。
首先,函数范围中的变量V覆盖了上层变量V,代码中很少有变化。
var;
如果(真){
console.log(V);
var;
}
输出结果是hello,表示Javascript不是块级别。
第二,在函数
作用域中,增加了变量v的声明,使原代码等价于:
var;
(函数(){())
var;
console.log(V);
世界;
});
声明、定义和初始化
声明要求存在一个名称,该名称被定义为该名称的存储
空间的分配,而初始化是名称分配的存储空间的初始值。
使用C++来表达三个概念
extern int i; / /这是一个声明,这个
名字我已经存在的地方。
这是名称i的声明和定义,我分配存储空间。
I=0;这是名称i的初始化,它的初始值是0
Javascript中的
情况就是这样。
var
vhello;(定义和初始化变量)V
由于Javascript是一种动态
语言,它的变量没有固定的
类型,它的存储空间会随着初始化和赋值而改变,所以它的变量的定义与传统的静态语言不一样。它的定义微不足道。
申报晋升
在当前作用域中的声明被提升到作用域的前面,包括变量和函数的声明。
(函数(){())
var1;
Var(f =函数){ };
var2;
var3;
});
变量a、f、b和c的声明将被提升到函数作用域的前面,如下所示:
(函数(){())
var,f,b,c;
a1;
f =函数(){ };
2;
3;
});
请注意,函数表达式没有被提升,这是函数表达式和函数声明之间的
区别。
(函数(){())
f1,函数F2(提升){;隐式提升语句
F1(); / / referenceerror:F1没有定义
(F2);
Var(f1 =函数){ };
函数(F2){ }
});
上面代码中的函数声明F2被提升,所以调用F2在前面是没有问题的。
名称解析
顺序 Javascript中的名称(名称)以四种方式进入范围(范围),其优先级顺序如下:
1、语言内置:所有域都有这个和
参数关键字
2。形式参数:函数的参数在函数范围内是有效的。
3,函数声明表单函数:(){ }
4、变量声明:如var条;
上面
显示了名称声明的优先级。也就是说,如果变量的名称与函数的名称相同,则函数的名称将覆盖变量的名称,不管代码中的顺序是什么,但是名称的初始化是按照代码中的顺序执行的,而不受上述优先级的
影响:
(函数(){())
变量Foo;
console.log(类Foo); / /
功能 函数(富){ }
;
console.log(类Foo); / /串
});
如果形参中有多个名称空间变量,则最后一个同名参数将覆盖其他同名参数,即使最后一个参数未定义。
上述名称解析优先权有例外,例如可以在语言中重写的名称参数。
命名函数表达式
可以像函数声明那样为函数表达式指定一个名称,但这并不能使函数表达式成为函数声明。命名函数表达式的名称不进入名称空间,也不会被提升。
f(); / /列表F是一个函数
foo(); / / referenceerror:Foo没有定义
var =函数foo(){ console.log(类Foo);};
f();函数
foo(); / / referenceerror:Foo没有定义
命名函数表达式的名称仅在函数作用域中有效。
请看下面的示例。
无功myval =我的全局变量;
(函数(){())
console.log(myval); / /日志我的全局变量
});
很明显,上面的代码将输出我的全局var
无功myval =我的全局变量;
(函数(){())
console.log(myval); / /日志定义
无功myval =我的局部变量;
});
执行结果是一个未定义的输出,而这个结果的
原因是提升了变量的声明,上面的代码与下面的相同:
无功myval =我的全局变量;
(函数(){())
无功myval;
console.log(myval); / /日志定义
myval =我的局部变量;
});
提升仅仅是变量的声明部分,并且它不会立即初始化,因此将输出未定义的部分。
然而,这种机制不仅表现在普通变量中,而且也体现在函数中:
(函数(){())
有趣的(TypeError); / /捕获的定义不是一个函数
var =函数(){()
console.log(你好!;
}
});
因为它相当于:
(函数(){())
VaR的乐趣;
有趣的(TypeError); / /捕获的定义不是一个函数
乐趣=函数(){
console.log(你好!;
}
});
因为函数的声明也在没有立即初始化的情况下被提倡,它将出错。
当然,定义函数的
方法称为函数表达式。将有一个升降机构。如果是下面的函数声明方式,就没有改进机制。
(函数(){())
(有趣);
功能乐趣(){
console.log(你好!)!
}
});
这也是函数语句和函数表达式之间的主要区别。