javascript的预解析

目录

一、预解析

1、定义

1.1声明

1.2定义

2、var预解析和function函数的预解析

2.1var预解析

         2.2function函数的预解析

2.3两者的区别

二、预解析中的一些机制

1、不管条件是否成立,提前声明带var的

2、 只预解析“=”左边的,右边的是指针,不参与预解析

3、 名字已经声明过了,不需要重新的声明,但是需要重新的赋值


 

一、预解析

1、定义

在当前作用域中,JavaScript代码执行之前,浏览器首先会默认的把所有带var和function声明的变量进行提前的声明或者定义

注:var是ES6之前的定义变量的方式。ES6之后引入了let。

var a = 10;

1.1声明

var a 就是声明,即在浏览器中声明一个a变量,但是并没有初始化。

1.2定义

a = 10 就是定义, 定义就是给变量进行赋值。

2、var预解析和function函数的预解析

2.1var预解析

        /*先解析var变量num
		  然后执行console输出
		  最后把10赋给num
        */
          console.log("num=",num); //先使用变量
          var num = 10; //再使用 var 关键词声明的变量,执行结果是 undefined

 

 注:在JavaScript中如果是没有使用 var 关键词声明的变量,执行结果是会报错 。

  •        如果是报错,之后的所有程序,都不会执行 。
  •        如果是 undefined 之后程序还可以继续执行。

原因:

2.2function函数的预解析

       /*
		   先解析fn函数的定义
		   然后执行console语句
		*/
		console.log("1+2+3+...+100=",fn());

		function fn(){
			var s = 0;
			for(var i=1;i<=100;i++){
				s += i;
			}
			return s;
		}

2.3两者的区别

  • var声明的变量在预解析的时候只是提前的声明。
  • function声明的函数在预解析的时候会提前声明并且会同时定义。

二、预解析中的一些机制

1、不管条件是否成立,提前声明带var的

if (!('num' in window)) { 
    var num = 12;
}
console.log(num); // undefined

先将num预解析,而预解析会将该变量添加到window中,作为window的一个属性。那么 'num' in window 就返回true,取反之后为false,这时代码执行不会进入if块里面,num也就没有被赋值,最后console.log(num)输出为undefined。

2、 只预解析“=”左边的,右边的是指针,不参与预解析

fn(); // -> undefined();  // Uncaught TypeError: fn is not a function
var fn = function () {
    console.log('ok');
}

fn(); -> 'ok'
function fn() {
    console.log('ok');
}
fn(); -> 'ok'

3、 名字已经声明过了,不需要重新的声明,但是需要重新的赋值

var fn = 13;                                       
function fn() {                                    
    console.log('ok');                               
}                                                  
fn(); // Uncaught TypeError: fn is not a function  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值