js变量声明提升
1、变量提升
根据javascript的运行机制和javascript没有块级作用域这个特点,可以得出,变量会声明提升移至作用域 scope (全局域或者当前函数作用域) 顶部的。
- 变量声明提升至全局域
console.log(a); // undefined
var a ="Hi"; 相当于 var a; // 变量提升到全局作用域
console.log(a); // 已声明变量a,但未初始化,固为undefined
a="Hi";
- 变量声明提升至当前函数域
var name = "boy";
(function () {
if (typeof name == 'undefined')
{
var name = 'girl';
console.log('Hi,' + name);
}
else
{
console.log('Hi,' + name);
}
})();// 控制台输出Hi,girl 相当于 var name = "boy";
(function () {
var name; //变量提升到当前函数作用域
if (typeof name == 'undefined')
{
name = 'girl';
console.log('Hi,' + name);
}
else
{
console.log('Hi,' + name);
}
})();
2、undefined和未定义(not defined)区别
undefined
undefined 表达的含义有三种情况:
- 这个变量 存在 ,但是并没有给予任何值。
- 一种普通的数据类型和一种值。你可以手工将任何变量赋值为 undefined,此时其没有特别含义。
- 一个 存在的对象 中的一个 不存在 (没有声明)的值,会被认为是 undefined。
对这三种情况进行归纳,undefined 可以如下总结:
- 它是一种数据类型,也是一种值。
- 有这种值的时候,要么它本身被赋值,要么本身存在,要么其所在对象存在。完全不存在的变量不会是 undefined。
未定义(not defined)
一个 未定义 (not defined) 的变量是 完全没有任何声明 的变量。这样的变量在使用时会直接抛出致命错误。但是,如果使用 typeof 来判断这样的变量,不但不会出错,而且竟然会返回 undefined ,这使得无法使用 typeof 来区分这两种情况。

js变量声明提升的更多相关文章
- 解读JavaScript中的Hoisting机制(js变量声明提升机制)
hoisting机制:javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面. 知识点一:javascript是没有 ...
- Js 变量声明提升和函数声明提升
Js代码分为两个阶段:编译阶段和执行阶段 Js代码的编译阶段会找到所有的声明,并用合适的作用域将它们关联起来,这是词法作用域的核心内容 包括变量声明(var a)和函数声明(function a(){ ...
- 详解js变量声明提升
之前一直觉会认为javascript代码执行是由上到下一行行执行的.自从看了<你不知道的JS>后发现这个观点并不完全正确.先来给大家举一个书本上的的例子: var a='hello wor ...
- JS变量声明提升和函数声明提升
JS代码在执行的时候会先找出执行代码中定义的变量和函数,对其进行声明. 例1:console.log(a); var a = 4; 此时输出undefined.a变量在执行console.log(a) ...
- JavaScript变量声明提升
JavaScript代码在被解析引擎执行前,会被“编译”把变量声明等放在合适的作用域中,如果不了解这一点,会让人产生很多疑惑. 文章:详解js变量声明提升
- 变量声明提升 Vs. 函数声明提升
1. 变量声明提升 先看以下代码: 1)var in_window = "a" in window; console.log(in_window); 2)var in_window ...
- [Effective JavaScript 笔记] 第12条:理解变量声明提升
js支持词法作用域,即除了极少的例外,对变量的引用会被绑定到声明变量最近的作用域中. js不支持块级作用域,即变量定义的作用域并不是离其最近的封闭语句或代码块,而是包含它们的函数. 不了解这个会产生一 ...
- javascript变量声明提升和函数声明提升
在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分. JS的解析过程分为两个阶段:预 ...
- js变量定义提升、this指针指向、运算符优先级、原型、继承、全局变量污染、对象属性及原型属性优先级
原文出自:http://www.cnblogs.com/xxcanghai/p/5189353.html作者:小小沧海 题目如下: function Foo() { getName = functio ...
随机推荐
- 2017-12-3 Crontab(字符串处理)
Crontab 哈哈本人的不及格代码(暂留): #include<iostream> #include<queue> #include<cmath> #includ ...
- [java]取当前平台默认字符集,取字符串长度
public class TimestampLength { public static void main(String[] args) { System.out.println(java.nio. ...
- 订阅发布模式eventEmiter
// 订阅发布模式 class EventEmitter { constructor() { this._events = {}; } on(name, callback) { if (this._e ...
- 如何使用git send-email发送补丁?
答: git send-email <patch-name> --to <username>@<example>.com --cc <username> ...
- zabbix监控nginx+php-fpm,mysql+主从复制+高可用,tomcat,redis web状态
zabbix监控对象区分 使用SNMP监控交换 使用IPMI监控服务器硬件 使用Agent监控服务器 使用JMX监控JAVA SNMP监控流程 交换机上开启snmp 在zabbix上添加监控(设置SN ...
- LC 873. Length of Longest Fibonacci Subsequence
A sequence X_1, X_2, ..., X_n is fibonacci-like if: n >= 3 X_i + X_{i+1} = X_{i+2} for all i + 2 ...
- NLP - Log-linear Models
1.The Language Modeling Problem 现在抛开我们之前讲的马尔科夫模型的假设,对于一门语言的定义,肯定不能简单依赖于每个单词的前两个单词,这是常识.比如英语中 ...
- flutter richText富文本
flutter中富文本使用 RichText( text: TextSpan( text: '登陆即同意', style: TextStyle(fontSize: 14, color: Colors. ...
- Web实现前后端分离,前后端解耦
一.前言 ”前后端分离“已经成为互联网项目开发的业界标杆,通过Tomcat+Ngnix(也可以中间有个Node.js),有效地进行解耦.并且前后端分离会为以后的大型分布式架构.弹性计算架构.微服务架构 ...
- ES安装的相关
es安装https://www.cnblogs.com/jingping/p/9448099.htmlhttps://blog.csdn.net/zhanyu1/article/details/880 ...