js hoisting -- 提升 学习笔记

昨天碰到小伙伴在问js函数提升的问题,虽然知道一点,但感觉自己说不清楚,于是搜了一下,找到一篇说的比较明白的翻译,参考地址如下:

http://www.cnblogs.com/betarabbit/archive/2012/01/28/2330446.html

 

1、理解js的作用域是函数级作用域。

大学学的C语言,块级作用域(block-level scope)早已印刻在我婶婶的脑海里,所以经常写出来这样的代码:

function setPrice(num){
    if( num >0 ){
        var price = num;
    }else{
        var price = -num;
    }
}

于是webstorem就给我的两个var标红了,那就改改呗,改成了这样:

function setPrice(num){
    var price;
    if( num >0 ){
        price = num;
    }else{
        price = -num;
    }
}

感觉自己好机智,然而这是怎么回事奈?

因为JavaScript是函数级作用域(function-level scope)。

也就是只有函数才会创建新的作用域,函数内的if,else块公用一个function的作用域。

 

2、说说“变量”提升

叫它们“变量”并不是很合适,目前没有想出来它们的名字,先暂时这样写吧。

在一个函数里可能出现的有下面这几种“变量”:

(1)语言自身定义(Language-defined): 所有的作用域默认都会包含this和arguments。

(2)函数形参(Formal parameters): 函数有名字的形参会进入到函数体的作用域中。

(3)函数声明(Function decalrations): 通过function的形式。

(4)变量声明(Variable declarations): 通过var的形式。(这里需要注意的是,ES6 出现了let这个专门针对块级区域的变量哟~)

 

以前师傅总让我把函数里的变量的声明写在函数的最上面,一直不明白为什么,也没有想到过,确实函数的声明也应该写在函数的最上面,那么这是为什么奈?

那时因为一个神奇的事情,名叫hoisting(提升),就是说,无论你是函数声明还是变量声明都会在js解释的时候被提升到他们作用域的最顶端。

 

setPrice: function(orginPrice,discount,coupon){    var price;

    if(discount){        price = calculateDiscount(orginPrice,discount);

    }else{        price = calculateCoupon(orginPrice,discount);    }

    function calculateDiscount(price,discount){        return orginPrice * ( 1 - discount);    }

    function calculateCoupon(price,coupon){        return orginPrice - coupon;    }

    this.down(‘#price‘).setData(price);}

 

这里的calculateDiscount,calculateCoupon的两个方法写在了执行语句的下边,但是并不会影响函数的执行,就是因为函数在解释时被提升的缘故。

 

需要注意的是声明的赋值部分并没有被提升。

也就是说

function aaa(){

    var a = 0 ;

}

这段函数被解释后是

function aaa(){

     var a ;

     a = 0;

}

 

恩~差不多久是这个样子啦~

时间: 2024-10-19 05:18:25

js hoisting -- 提升 学习笔记的相关文章

node.js框架StrongLoop学习笔记(一)

node.js框架StrongLoop学习笔记(一) 本人在用node.js做手机后台,查找框架发现StrongLoop挺适合,可是却发现没有中文教程,于是在自己学习时,做一下笔记,以方便其他像我一样的人参考(本人的英语水平非常差,只能一点点试着做,并记录下来,如果大家发现问题,请通知我好更正,谢谢了!).所有操作都是在CentOS7-x64,Node.js 0.12.2下完成的. nodejs框架StrongLoop学习笔记一 安装StrongLoop 创建项目 安装数据库驱动 配置数据库连接

js的dom学习笔记一

前言: 我现在不好定位自己程序编写的技术的好坏,新手吧.DOM是实现js脚本连接上HTML文档的一个API,才接触jquery一两天,大概能明白,所谓的框架,就是在原生态的基础上做出的函数库,里面的方法.属性都是要使用该框架的对象来调用的.相比于jquery,DOM不是框架,虽然它们都能实现操控网页文档元素,DOM更加底层,dom的方法.属性直接面对文档元素来使用,而jquery要面向jquery对象来使用. DOM 是一个可以让javaScript脚本操控HTML元素.css属性的一套w3c标

js中函数学习笔记

函数: 具名函数 匿名函数 一.函数定义 (1)函数声明 函数声明只能出现在程序或函数体内, function  fun(){ //函数体 } (2)函数表达式 匿名函数表达式 var fun = function(){ //函数体 } 具名函数表达式 var fun = function f(){ //函数体 } 具名函数表达式的函数名只能在创建函数内部使用 (3)函数构造函数 Var fun = new Function(),一般不建议使用 二.函数调用方式: (1)作为函数被调用,是由于函

JS与Jquery学习笔记(二)

施工中........... 一. JS 的面向对象 二. 用JS移动和复制元素 三. 如何给动态生成的元素绑定事件 四. 事件绑定函数的入参 五. $.each和$.map的用法与区别

js对象的学习笔记(仅供参考)

一.面向对象语言的基本特征: 抽象.封装.继承.多态 封装:将抽象的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作(成员方法),才能对数据进行操作 继承:由一个或多个类得来类的类的属性和方法的能力,一个类可以继承(extends)父类中的(public/protect)属性和(public/protect)方法,继承可以解决代码复用问题 多态:编写能以多种方法运行的函数或方法的能力 JS对象类型:本地对象.宿主对象(浏览器对象).内置对象 本地对象:独立于宿主

js基础教程学习笔记

document.write(); document.getElementById(); <script type="text/javascript"></script> 表示在<script></script>之间的文本类型text,javascript是为了告诉浏览器里面的文本是javascript语言 我们可以把js代码与html代码分开,并在html中引用: <script src="script.js"

js权威指南---学习笔记02

1.JS只有函数作用域,没有块级作用域这个概念: 它有一个特性——声明提前:在同一个函数中不同位置声明的变量,都被提前在函数开始的时候,执行声明操作:在原先位置执行赋值操作: 2.声明的全局变量,相当于定义了全局对象的一个属性: 1)如果使用var声明全局变量,这个属性是不可配置的.也就是无法delete 2)如果不使用var声明,则可以进行delete: 例子: var s1 = "s1";  //不可配置的全局变量 s2 = "s2";   //可配置的全局变量

Vue.js 源码学习笔记 -- 分析前准备 待续

主体 实例方法归类: data     数据方法 dom     dom方法 event    事件处理 lifecycl   生命周期函数 init 初始化vue页面 全局方法: derectives filters init过程 data : observer deps computed watch || watcher template: fragment [ directive repeat if component transition filter ] 重点: 把数据(Model)

JS高级程序设计学习笔记之第三章基本概念(语法,数据类型,流控制语句,函数)——查漏补缺

一.语法: 区分大小写 2.标识符:就是指变量.函数.属性的名字,或者函数的参数 a.标志符的规则:①第一个字符必须是一个字母.下划线(_)或一个美元符号($).                   ②其他字符可以是字母,下划线,美元符号或者数字. b.标志符采用驼峰大小写格式. c.严格模式:在顶部添加以下代码:"use strict"; d.语句:结尾加入分号.在控制语句中使用代码块为最佳实践. 二.关键字与保留字 三.变量:ECMAScript的变量是松散类型,可以保存任何类型的