var是否可以省略

一般情况下,是可以省略var的,但有两点值得注意:

1、var a=1 与 a=1 ,这两条语句一般情况下作用是一样的。但是前者不能用delete删除。不过,绝大多数情况下,这种差异是可以忽略的。
2、在函数内部,如果没有用var 进行申明,则创建的变量是全局变量,而不是局部变量了。

所以,建议变量申明加上var关键字。

变量提升

JavaScript引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升(hoisting)。

示例:

console.log(a);
var a =1;

以上语句并不会报错,只是提示undefined。实际运行过程:

var a;
console.log(a);
a =1;

表示变量a已声明,但还未赋值。但是变量提升只对var命令声明的变量有效,如果一个变量不是用var命令声明的,就不会发生变量提升。

console.log(aa);
aa =1;

以上代码将会报错:ReferenceError: aa is not defined

与普通变量一样,js里的function也可看做变量,也存在变量提升情况:

a();

function a(){
console.log(1);
};

表面上,上面代码好像在声明之前就调用了函数a。但是实际上,由于“变量提升”,函数a定义部分被提升到了代码头部,也就是在调用之前已经声明了。但是,如果采用赋值语句定义函数,JavaScript就会报错:

a();

var a = function(){
console.log(1);
}; // TypeError: a is not a function

因为,实际运行过程:

var a;
a(); a = function(){
console.log(1);
};

这时候a是个变量,并非function

var与变量提升的更多相关文章

  1. js笔记——js里var与变量提升

    var是否可以省略 一般情况下,是可以省略var的,但有两点值得注意: 1.var a=1 与 a=1 ,这两条语句一般情况下作用是一样的.但是前者不能用delete删除.不过,绝大多数情况下,这种差 ...

  2. var的变量提升的底层原理是什么?

    原理:JS引擎的工作方式是①先解析代码,获取所有被声明的变量:②然后在运行.也就是专业来说是分为预处理和执行两个阶段. 变量提升的定义:所有变量的声明语句都会被提升到代码头部,这就是变量提升. 例如: ...

  3. 深入理解js的变量提升和函数提升

    一.变量提升 在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分.上个简历的例子如: ...

  4. Js 语言中 变量提升问题

    变量提升: 提升变量的声明. 函数声明式: 像这种形式: function foo() {}: 会发生变量提升. 函数表达式: var fn=function fn(){}: 不会发生变量提升.var ...

  5. JavaScript中的变量提升和函数提升

    在EcmaScript5中只有全局作用域和函数作用域,EcmaScript6增加了块级作用域. 块级作用域(一对花括号{}即为一个块级作用域) 变量提升 console.log(name); //un ...

  6. js中变量提升(一个是变量,一个是函数表达式都会存在变量提升,函数声明不存在)

    一.变量提升 在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分.上个简历的例子如: ...

  7. js javascript变量提升

    var:变量提升(无论声明在何处,都会被提至其所在作用域的顶部) let:无变量提升(所在的块内,未到let声明时(即let声明之前),是无法访问该变量的(not defined)),let变量不能重 ...

  8. 深入理解js的变量提升和函数提升(转)

    一.变量提升 在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分.上个简历的例子如: ...

  9. ES6的let和var声明变量的区别

    关于let的描述 let允许你声明一个作用域被限制在块级中的变量.语句或者表达式.与var关键字不同的是,它声明的变量只能是全局或者整个函数块的. 作用域规则 let声明的变量只在其声明的块或子块中可 ...

随机推荐

  1. 关于django rest framework里token auth的实现及答疑

    http://stackoverflow.com/questions/14838128/django-rest-framework-token-authentication ============= ...

  2. Integration testing

    Integration testing 集成测试用来确保app的不同模块之间可以正确的一起工作.ASP.NET Core提供单元测试框架和内建的测试网络服务来支持集成测试,并且测试网络服务不需要网络开 ...

  3. cmake ccmake

    下载libqrencode源码编译过程 git clone https://github.com/fukuchi/libqrencode.git 2001  mkdir build 2002  cd ...

  4. 【IOI2014】Game

    题目简述 健佳是一个喜欢做游戏的小男生.当有人问问题时,他更喜欢通过玩游戏的方式作答,而不是直接回答.健佳碰到了他的朋友梅玉,跟她讲了台湾的航空网.在台湾有 $n$ 个城市(编号为 $0, \dots ...

  5. PHP运行环境搭建

    说明 我的百度百度云盘里面有apache24,PHP7.0,mysql5.6,如果需要的话可以直接下载: apache的环境我已经配置好了,将其解压到C盘根目录 相应绝对路径为C:\Apache24 ...

  6. Eval is evil ('Eval是魔鬼') --- eval()函数

    Eval is evil ('Eval是魔鬼') eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码.语法:eval(string): eval的使用场合是什么呢?有时候我 ...

  7. Android Service实现双向通信(一)

    首先,大概来总结一下与Service的通信方式有很多种: 通过BroadCastReceiver:这种方式是最简单的,只能用来交换简单的数据: 通过Messager:这种方式是通过一个传递一个Mess ...

  8. android TextView 设置字体大小

    package com.example.yanlei.yl4; import android.graphics.Color;import android.os.Bundle;import androi ...

  9. vscode格式化代码无效--可能的解决方法

    因为vscode默认启用了根据文件类型自动设置tabsize的选项,因此,可以通过关闭自动设置选项,防止格式覆盖.在用户设置里添加如下配置即可: "editor.detectIndentat ...

  10. iOS上如何让按钮(UIbutton)文本左对齐展示

    // button.titleLabel.textAlignment = NSTextAlignmentLeft; 这句无效 button.contentHorizontalAlignment = U ...