JavaScript关于var关键字需要知道的
关于var关键字需要知道的
要定义变量,可以使用var操作符(注意var是一个关键字),后跟变量名(即标识符,如前所述):
var message ;
这行代码定义了一个名为message的变量,可以用它保存任何类型的值。(不初始化的情况下,变量会保存一个特殊值undefined,下一节讨论数据类型时会谈到。) ECMAScript实现变量初始化,因此可以同时定义变量并设置它的值:
var message = "hi";
这里, message被定义为一个保存字符串值hi的变量。像这样初始化变量不会将它标识为字符串类型,只是一个简单的赋值而已。随后,不仅可以改变保存的值,也可以改变值的类型:
var message = "hi" ;
message = 100;
合法,但不推荐 在这个例子中,变量message首先被定义为- -个保存字符串值hi的变量,然后又被重写为了保存数值100。虽然不推荐改变变量保存值的类型,但这在ECMAScript中是完全有效的。
var声明作用域 关键的问题在于,使用var操作符定义的变量会成为包含它的函数的局部变量。比如,使用var在一个函数内部定义一个变量,就意味着该变量将在函数退出时被销毁:.
function test() {
var message = "hi"; //局部变量
test();
console. log (message) ; //出错!
这里,message变量是在函数内部使用var定义的。函数叫test(),调用它会创建这个变量并给它赋值。调用之后变量随即被销毁,因此示例中的最后- -行会导致错误。不过,在函数内定义变量时省略var操作符,可以创建-一个全局变量:
function test() { .
message = "hi";
1/全局变量
test() ;
console. log (message); // "hi"
去掉之前的var操作符之后. messace就变成了全局变量。只要调用一-次函数test().就会定义
-
对于var关键字,要么定义全局变量、要么定义函数内变量;
-
不能定义只在一个语句块儿内部起作用的变量;
-
这叫做js的函数级作用域(function-level scope);
(function test(){
if (true) {
x = 5; //x的作用域为全局
}
console.log(x); // 5
})();
function foo() {
var x = 1;
if (x) {
(function () {
var x = 2;
}());
}
console.log(x); //1
}
foo();
在严格模式下不能定义一个不被var修饰的变量
(function test(){
if (true) {
x = 5; //x的作用域为全局,严格模式报错
}
console.log(x); // 5
})();
console.log(x); // 5
var 声明提升
function foo() {
var age;
console.log(age) ;
age = 26;
}
foo() ;/ / undefined
使用 var 时,下面的代码不会报错。这是因为使用这个关键字声明的变量会自动提升到函数作用域 顶部
function foo() {
console.log(age) ;
var age = 26;
}
foo() ;/ / undefined
这就是所谓的“提升”(hoist),也就是把所有变量声明都拉到函数作用域的顶部。此外,反复多次 使用 var 声明同一个变量也没有问题:
- 点赞
- 收藏
- 关注作者
评论(0)