这篇随笔是对网上文章的整理吸收

1. javascript的作用域是函数,不是块
2. 在函数内部,javascript解释器会把var变量提升到当前域的最前面,但是函数体不会提升。

看下面例子:

var v = "hello";
(function(){
console.log(v);
// var v = "world";
})();

输出值为 hello

var v = "hello";
(function(){
console.log(v);
var v = "world";
})();

输出值为undefined

why?

因为第二个函数javascript解释器会解释成下面这样执行

var v = "hello";
(function () {
var v;
console.log(v);
v = "world";
})();

变量v没有赋值所以输出undefind。

函数和变量的声明会被提升,函数定义和变量定义不会被提升

看下面例子

(function(){
f1();
var f1 = function(){};
})();

**上面函数执行会报 **

TypeError: undefined is not a function

这个很好解释,因为函数会被javascript解释为

(function () {
var f;
f1();
f1 = function () {
};
})();

下面这个函数可以运行,不要觉得奇怪

(function () {
f2();
function f2() {
console.log('will run !');
}
})();

因为它被解释成下面这样了。函数定义被提到最前面了。

(function () {
function f2() {
console.log('will run !');
}
f2();
})();

猜猜下面代码执行效果?

(function(){
var foo;
console.log(typeof foo); //function
function foo(){}
foo = "foo";
console.log(typeof foo); //string
})();

为什么?因为它同下面这个函数是一样的。

(function(){
var foo;
function foo(){}
console.log(typeof foo); //function
foo = "foo";
console.log(typeof foo); //string
})();

javascript的变量声明提升的更多相关文章

  1. JavaScript 变量声明提升

    JavaScript 变量声明提升 一.变量提升的部分只是变量的声明,赋值语句和可执行的代码逻辑还保持在原地不动 二.在基本的语句(或者说代码块)中(比如:if语句.for语句.while语句.swi ...

  2. javascript变量声明提升和函数声明提升

    在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分. JS的解析过程分为两个阶段:预 ...

  3. 解读JavaScript中的Hoisting机制(js变量声明提升机制)

    hoisting机制:javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面. 知识点一:javascript是没有 ...

  4. javascript变量声明提升(hoisting)

    javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面. 先看一段代码 1 2 3 4 5 var v = &quo ...

  5. 浅谈JavaScript变量声明提升

    前段时间阿里实习生内推,一面就被刷了,也是郁闷.今天系统给发通知,大致意思就是内推环节不足以了解彼此,还可以参加笔试,于是赶紧再投一次.官网流程显示笔试时间3月31日,时间快到了,开始刷题.网上搜了一 ...

  6. JavaScript变量声明提升

    JavaScript代码在被解析引擎执行前,会被“编译”把变量声明等放在合适的作用域中,如果不了解这一点,会让人产生很多疑惑. 文章:详解js变量声明提升

  7. [Effective JavaScript 笔记] 第12条:理解变量声明提升

    js支持词法作用域,即除了极少的例外,对变量的引用会被绑定到声明变量最近的作用域中. js不支持块级作用域,即变量定义的作用域并不是离其最近的封闭语句或代码块,而是包含它们的函数. 不了解这个会产生一 ...

  8. js变量声明提升

    1.变量提升 根据javascript的运行机制和javascript没有块级作用域这个特点,可以得出,变量会声明提升移至作用域 scope (全局域或者当前函数作用域) 顶部的. 变量声明提升至全局 ...

  9. 【你不知道的javaScript 上卷 笔记3】javaScript中的声明提升表现

    console.log( a ); var a = 2; 执行输出undefined a = 2; var a; console.log( a ); 执行输出2 说明:javaScript 运行时在编 ...

随机推荐

  1. appium for iOS config

    appium-doctor: Running iOS Checks ✔ Xcode is installed at /Applications/Xcode.app/Contents/Developer ...

  2. (三)Netty源码学习笔记之boss线程处理流程

    尊重原创,转载注明出处,原文地址:http://www.cnblogs.com/cishengchongyan/p/6160194.html  本文我们将先从NioEventLoop开始来学习服务端的 ...

  3. 常见端口 HTTP代码

    端口号 系统保留了前0到1023端口作为常用的网络服务. 0-1023 公认端口 1024-49151 注册端口 49152-65535 动态或私有端口 1 TCPMUX 主要在SGI Irix机器 ...

  4. 3ds max 渲染模型

    有的模型因为法线方向问题,渲染的时候有的面缺失,只需要强制双面,如下图,就能把所有的面都渲染出来.

  5. 【转】Caffe初试(九)solver及其设置

    solver算是caffe的核心的核心,它协调着整个模型的运作.caffe程序运行必带的一个参数就是solver配置文件.运行代码一般为 #caffe train --solver=*_solver. ...

  6. mysql主从

    1       系统规划 1.1     mysql版本 Mysql版本 mysql-5.5.51 1.2     服务器地址 服务器地址 10.180.2.167 1.3     mysql目录 主 ...

  7. HAProxy的安装与使用

    在互联网时代中,后台系统架构,经常可以听到高可用集群.负载均衡集群之类的系统架构解决方案,其中,负载均衡有基于硬件的F5.Big-IP等,也有基于软件的LVS(基于Linux操作系统实现,性能可以和基 ...

  8. Tensorflow 处理libsvm格式数据生成TFRecord (parse libsvm data to TFRecord)

    #写libsvm格式 数据 write libsvm     #!/usr/bin/env python #coding=gbk # ================================= ...

  9. 让IIS支持bootstrap 增加svg和woff格式文件的支持

    增加以下两种文件类型即可: .woff application/x-woff.svg image/svg+xml

  10. Datazen图表创建和发布

    Datazen是被微软收购的移动端全平台的数据展现解决方案.此篇主要介绍如何创建和发布图表. 如前面介绍,Datazen图表的创建和发布是通过Publisher的应用,它是Windows 8应用商店下 ...