JavaScript关于var关键字需要知道的

举报
坚果派 发表于 2022/03/08 16:24:39 2022/03/08
【摘要】 关于var关键字需要知道的要定义变量,可以使用var操作符(注意var是一个关键字),后跟变量名(即标识符,如前所述):var message ;这行代码定义了一个名为message的变量,可以用它保存任何类型的值。(不初始化的情况下,变量会保存一个特殊值undefined,下一节讨论数据类型时会谈到。) ECMAScript实现变量初始化,因此可以同时定义变量并设置它的值:var mess...

关于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 声明同一个变量也没有问题:

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。