分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 代码编程

JS中的变量声明提升

发布时间:2023-09-06 02:16责任编辑:蔡小小关键词:暂无标签

JS是一种脚本语言,和一些高级语言不同,它没有完整编译的过程,一般是边写边编译,这也是我们觉得脚本语言比其他语言加载快的原因,其实,JS中有变量声明提升这一机制。当JS在执行的时候会分为2个阶段,预解析,执行,当JS在执行的时候会将所有用var声明的变量以及关键字定义的函数进行提升(  function  fn(){......}  ),提升到当前作用域的最顶端,而赋值语句在原地等待执行,预解析后,再从上往下逐行解析代码。预解析遵循一些原则,下面一点一点的说明。

提到变量声明提升,就得结合作用域来分析,也就是局部作用域能访问到全局的变量,而全局作用域访问不到局部作用域。

例:

  var a=1;

  function fn(){

    alert(a);

     a=2;

  }

fn();      

alert(a);

当fn执行后,会弹出1,因为局部作用域能访问到全局作用域,代码逐行执行,这个a就是上面声明的那个a,但在全局再弹出a,a变成了2,因为函数内部对它进行的更改。

例:

  var a=1;

function fn(){

  alert(a)

  var a =2;

}

fn();

alert(a);

这时,函数内部弹出的a是undefined,因为函数内部声明了一个a,进行了变量声明提升,提升到当前作用域的最顶端,赋值语句不动,也就是函数变成了下面这样

function fn(){

  var a;

  alert(a)

   a =2;  //这里的a 是指函数内部的a,不管全局作用域还是局部作用域都遵循就近原则。

}

全局弹出的a是1,因为全局访问不到局部变量,即使在函数中var 了一个a但访问不到。

例:

var a=1;

function fn(a){

  alert(a);

  a=2;

}

fn();

alert(a);

函数内弹undefined,全局弹1.但这个和上一个例子不一样。函数传一个参数,就相当于在函数内声明了一个变量,所以函数内弹undefined,全局仍然弹1

例:

  

var a=1;

function fn(a){

  alert(a);

  a=2;

}

fn(a);

alert(a);

函数内弹1,因为函数调用的时候把全局的a传了进去,别看全局和函数都有个a,但2个a是不一样的,不是同一个变量,全局仍然弹1.

下面上几个有难度的,

JS中的变量声明提升

原文地址:https://www.cnblogs.com/lzn0330/p/9709654.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved