1. 变量提升hoisting

变量提升的意思是在一个变量作用域里定义的变量的声明会被提升到作用域的顶部,这是变量只会被声明,不会被初始化复制,而是undefined。

代码如下:

     function scopefunc() {
console.log(variable1);
/* console.log(variable2);*/
var variable1 = "I'm variable1";
console.log(variable1);
};
window.onload = function () {
scopefunc();
}

运行结果:

undefined

I'm variable1

被注释的那句代码会报错,证明没被定义的变量不是undefined而是直接报错。

针对变量的这个特性,在编写javascript代码时,应当遵循这样的风格:

在一个作用域的顶部使用一个 var 且定义所有的变量,可初始化或不初始化

如下:

 function scropefunc() {
var variable1 = "I'm variable1",
variable2,func1;
console.log(variable1);
func1 = function () {
variable2 = "I'm variable2";
console.log(variable2);
};
}

ES6中使用的let 声明的变量不会发生变量提升,同时作用域是块作用域,表现就是当前花括号内。

函数声明:

(function() {
log("first log");
function log(arg) {
console.log(arg);
}
log("second log");
})();

函数声明也会被提到作用域的顶部,所以在声明之前使用函数也是可以的,比如上面的log函数。

ES5中函数声明不能在块中,但ES6中可以在块中声明函数,类似于使用了let所以不能提前使用,在具体使用时还是很容易令人迷惑的,所以避免在块中声明函数。

2. 变量作用域链

在上面一段代码中,func1函数里访问了variable2这个变量,但是这个变量只是在func1的外面的scopefunc函数内定义的,没有被func1所定义,那么func1是怎么找到的呢?

先介绍执行环境的概念,函数被调用时会产生一个新的执行环境,在JavaScipt引擎中,执行环境对象实现了执行环境这个概念。执行环境是可以嵌套的,并且内层的执行环境可以访问外层的执行环境,但外层的不能访问内层的执行环境。就像是一条链子,JavaScript在访问变量时,从当前执行环境开始查找,如果没有找到,向上一级执行环境中查找,直到顶级的执行环境(html中是window对象,nodejs是global),

3. 立即调用函数表达式 IIFE

立即调用函数表达式的全称是 Immediately Invoked Function Expression

这是一个js函数,在定义时就会执行,通常会用来防止污染全局变量,在模块模式中经常会用到

代码示例如下:

(function() {
var private_Var = 7;
console.log("this is inner IIFE");
})();

将这段代码靠到nodejs的命令行,回车就会输出this is inner IIFE,并且访问private_Var会出错。

javascript学习总结一的更多相关文章

  1. JavaScript学习(一) —— 环境搭建与JavaScript初探

    1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...

  2. Web编程基础--HTML、CSS、JavaScript 学习之课程作业“仿360极速浏览器新标签页”

    Web编程基础--HTML.CSS.JavaScript 学习之课程作业"仿360极速浏览器新标签页" 背景: 作为一个中专网站建设出身,之前总是做静态的HTML+CSS+DIV没 ...

  3. JavaScript学习(3):函数式编程

    在这篇文章里,我们讨论函数式编程. 什么是函数式编程?根据百度百科的描述,“函数式编程是种编程典范,它将电脑运算视为函数的计算.函数编程语言最重要的基础是 λ 演算(lambda calculus). ...

  4. JavaScript学习(2):对象、集合以及错误处理

    在这篇文章里,我们讨论一下JavaScript中的对象.数组以及错误处理. 1. 对象 对象是JavaScript中的一种基本类型,它内部包含一些属性,我们可以对这些属性进行增删操作. 1.1 属性 ...

  5. JavaScript学习13 JavaScript中的继承

    JavaScript学习13 JavaScript中的继承 继承第一种方式:对象冒充 <script type="text/javascript"> //继承第一种方式 ...

  6. JavaScript学习12 JS中定义对象的几种方式

    JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工 ...

  7. JavaScript学习11 数组排序实例

    JavaScript学习11 数组排序实例 数组声明 关于数组对象的声明,以前说过:http://www.cnblogs.com/mengdd/p/3680649.html 数组声明的一种方式: va ...

  8. JavaScript学习10 JS数据类型、强制类型转换和对象属性

    JavaScript学习10 JS数据类型.强制类型转换和对象属性 JavaScript数据类型 JavaScript中有五种原始数据类型:Undefined.Null.Boolean.Number以 ...

  9. JavaScript学习09 函数本质及Function对象深入探索

    JavaScript学习09 函数本质及Function对象深入探索 在JavaScript中,函数function就是对象. JS中没有方法重载 在JavaScript中,没有方法(函数)重载的概念 ...

  10. JavaScript学习08 Cookie对象

    JavaScript学习08 Cookie对象 JavaScript Cookie Cookie对象: Cookie是一种以文件的形式保存在客户端硬盘的Cookies文件夹中的用户数据信息(Cooki ...

随机推荐

  1. 原生拖拽js利用localstorage保存位置

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. elfinder中通过DirectoryStream.Filter实现筛选隐藏目录(二)

    今天还是没事看了看elfinder源码,发现之前说的两个版本实现都是基于不同的jdkelfinder源码浏览-Volume文件系统操作类(1), 带前端页面的是基于1.6中File实现,另一个是基于1 ...

  3. 为什么TCP的ISN是随机的?

    两个维度: 1)攻击维度 如果TCP每次连接都使用固定ISN,黑客可以很方便模拟任何IP与server建立连接. 问题:通过抓包就可以计算出来TCP连接的ISN,那固定于不固定ISN有什么区别呢? 答 ...

  4. 前端的UI设计与交互之数据展示篇

    合适的数据展示方式可以帮助用户快速地定位和浏览数据,以及更高效得协同工作.在设计时有以下几点需要注意:依据信息的重要等级.操作频率和关联程度来编排展示的顺序.注意极端情况下的引导.如数据信息过长,内容 ...

  5. V-bind详细使用

    v-bind  主要用于属性绑定,Vue官方提供了一个简写方式 :bind,例如: <!-- 完整语法 --> <a v-bind:href="url">& ...

  6. 使用localStorage保存搜索记录

    //过滤一个结果的空记录添加,过滤空搜索 默认保存10条记录,自己可修改 function setHistoryItems(keyword) { keyword = keyword.replace(& ...

  7. java 二叉树排序

    1 class BinaryTree{ 2 class Node{ 3 private Comparable data; 4 private Node left; 5 private Node rig ...

  8. java 语法分析器 括号匹配

    package test; import java.util.*;public class Test {    public String text="fewe{f(sdd(f)a[j]sd ...

  9. PLSQL配置怎么连ORACLE

    如果是windows的话,在服务里面就可以查服务要启动,监听也要启动!可以用lsnrctl命令查看监听! 首先你需要在我的电脑的属性里,找到环境变量,配置系统下面的path,看看里面指向的是哪里(我的 ...

  10. zabbix通过SNMP监控服务器硬件及构建触发器

    公司的服务器没装系统无法使用IPMI协议来监控服务器硬件信息,所以我们使用SNMP来获取,下面介绍如何通过SNMP监控服务器硬件信息. 1.HP服务器进入iLO开启SNMP协议. 2.查看服务器温度信 ...