javascript中的作用域和变量声明提升

一、变量的作用域

JavaScript的this总是指向一个明确的对象,这个对象是在执行的时候动态绑定的。通俗的说就是谁调用我,我的this就是谁。
除去不常用的with和eval,具体的实际应用中,this的指向分为以下四种情况:

 1. ·作为对象的调用;
 2. ·作为普通函数的调用;
 3. ·构造器的调用;
 4. ·Function.propotype.call 和 Functio.propotype.apply 调用;

严格模式下,函数内部的this指向的是underfind,并不会指向window

var funF=function(){
    alert(this);
};
var funStrictF=function(){
    'use strict'
    alert(this);
};
funF();//window
funStrictF();//underfind

“一个变量的作用域表示这个变量存在的上下文。它指定了你可以访问哪些变量以及你是否有权限访问某个变量。”

变量作用域分为局部作用域和全局作用域。

局部变量(处于函数级别的作用域)
不像其他对面对象的编程语言(比方说C++,Java等等),javascript没有块级作用域(被花括号包围的);当是,javascript有拥有函数级别的作用域,也就是说,在一个函数内定义的变量只能在函数内部访问或者这个函数内部的函数访问(闭包除外)。

块级作用域

ES6:

   JS增加了块级作用域(最近大括号的作用范围),但仅限于let声明的变量,let声明的变量才有块级作用域。

变量声明提升

因为变量申明是在任意代码执行前处理的,在代码区中任意地方申明变量和在最开始(最上面)的地方申明是一样的。也就是说,看起来一个变量可以在申明之前被使用!这种行为就是所谓的“hoisting”,也就是变量提升,看起来就像变量的申明被自动移动到了函数或全局代码的最顶上。

注意:仅仅是申明提升了,定义并不会被提升。

暂时性死区

只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。

总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)

总结

	1、所有申明都会被提升到作用域的最顶上,变量声明提升仅仅是声明提升,定义并不提升;函数声明会连带 定义一起被提升

    2、同一个变量申明只进行一次,并且因此其他申明都会被忽略,变成赋值操作

       如:var i = 0 ; var i = 1     相当于 var i ;  i = 0 ; i = 1;  

    3、函数声明的优先级优于变量申明,且函数声明会连带定义一起被提升

原文连接:https://www.jianshu.com/p/d500c909194b

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值