一种毫无节操的机制---预解释

一:预解释时,不管条件是否成立,都要把所有带var关键字的进行提前声明。

   例子:

-------->

分析:因为预解释时,不管条件是否成,都要把所有带var关键字的进行提前声明,而且var num相当于在window增加一个属性名为num(window.num),"num" in window代表判断num是否为window对象的一个属性,如果是,则会返回true,否则返回false,所以经过预解释后,"num" in window返回true,而取反后为false,所以不会执行num=12的操作,所以console.log(num);的输出结果为undefined。

二:预解释时,只会解释"="左边的,而"="右边的是值,不会参与解释。

    例子:

  ——————————>

当使用匿名函数之函数表达式(就是把函数定义的部分当做一个值赋值给我们的变量或者元素的某一个事件)来定义函数:

——————————>

分析:因为预解释时,只会解释"="左边的,而"="右边的是值,不会参与解释,所以在预解释的时候只解释var fn,所以

在var fn前就调用fn()的时候会报一个TypeError:fn is not a function的错误。

三:自执行函数定义的那个function在全局作用域下不进行预解释,当代码执行到自执行函数时就把函数的定义和执行一起完成了。

 定义和执行一起完成的函数叫做自执行函数。自执行函数有如下几个定义方式:

(function (num){ })(100); ---->圆括号型

~function (num){ })(100);----->波浪号型

+function (num){ })(100);----->加号型

-function (num){ })(100);----->减号型

+function (num){ })(100);----->加号型

!function (num){ })(100);----->感叹号型

除了加上()外还可以通过+、-、~、!等符号来定义,这些符号的意义只是让函数符合语法,可以说只是一个装饰的作用。

四:函数体中的return下面的代码虽然不会再执行了,但是需要进行预解释

(return后面的都是我们的返回值,所以跟着return后面的都不解释。)

例子:

	function fn() {
   	 console.log(num);//--->undefined
    	return function () {

   	 };
    	var num = 100;
	}
	fn();
结果:
	
分析:运行函数的时候,在该函数的私有作用域中预解释的时候,var num被解释,但是因为num=100在return语句下面不执行,所以num没有被定义,所以
console.log(num)输出为undefined。
五:在与解释时,如果名字已经声明过了就不需要重新再声明了,但是定义还是会执行的。
在js中,如果变量和函数的名字重复了,也算是一种冲突。
在全局作用域中预解释,var fn-->window.fn,function fn(fn存放地址,fn=xxxfff000)--->window.fn=xxxfff000.
例子:
   	 fn();    //输出2
   	 function fn() {
       		 console.log(1);
   	 }
	fn();	//输出2

   	 var fn=10;   //fn变为10
	fn();         //报错:TypeError: fn is not a function,后面代码不执行
    	function fn() {
        	console.log(2);
   	 }
	fn();
结果:
	
分析在与解释时,function fn 声明了一个fn,而且声明了就不会再声明了,同时也会定义,但是定义了会被后面的定义覆盖,所以过程为
1、声明+定义fn=xxxfff111 --->2、声明 var fn(但是不需要重新声明,但执行到该步的时候会对fn定义赋值)--->3、声明
声明+定义fn=xxxfff222(不重复声明,但会定义,所以fn=xxxfff222);
	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值