JS中的预解释

1、什么是预解释?

在当前作用域下,JS代码执行之前,首先会把带var/function关键字的进行提前的声明(declare)或者定义(defined)。

2、预解释是如何操作的?

a.带var关键字的在预解释阶段只完成了提前的声明;b.带function关键字的在预解释阶段完成了声明和定义两个操作。

3、预解释的注意点?

a.不管条件判断是否成立,判断体中的内容都要进行预解释;

    例如:if (!(‘a‘ in window)) {

           var a=12;

           //判断‘a‘是否为window的一个属性名,因为预解释的时候声明了‘a‘,所以为true,取反为false,条件不成立,a=12执行不了,输出a=undefined;

       }

b.预解释的时候只对"="等号左边的变量进行预解释,右边代表的都是值,是不进行预解释的;

    例1:fn();  //可以在函数前面执行,因为在预解释的时候,fn声明和定义都完成了

       function fn(){

          console.log(‘ok‘);

       }

    例2:fn(); //这样就会报错fn is not a function,因为在预解释的时候只是对等号左边的值进行了预解释,此时fn的值是undefined,不是一个函数,不能执行 

       var fn=function(){

          console.log(‘ok‘);

       }

3、在全局作用域下预解释的时候,自执行函数中的function是不参与的,当代吗执行到对应的区域后,声明、定义、执行一起完成;

4、虽然函数体中return下面的代码是不执行的,但是需要进行私有作用域下的预解释,而return后面的是返回值,是不进行预解释的;

  例如:var a=1;

     function fn(){

     console.log(a);   //私有作用域下的预解释,首先在私有作用域中var a,说明a是私有变量,但是return下面的代码不执行,所以a为undefined;

       return function(){  };   // return后面的不进行预解释,返回的是这个函数对应的地址;

     var a=10;

     }

    fn();

5、在预解释的时候,如果发现名字冲突了,不需要重新声明,但是需要重新的赋值。(在JS中不管是变量还是函数,只要名字一样了,就是相互冲突,JS中一个名字就代表一个变量,只不过存储的值可以是任意数据类型的)

  在全局作用域下不管是声明变量还是定义函数,都是在给window增加属性名。

  例如:fn();  //输出结果2

      function fn(){ console.log(1); }

      fn();  //输出结果2

      var fn=13;

      fn();   //报错

      function fn(){ console.log(2); }

      fn();   //输出结果2

时间: 2024-10-13 09:50:56

JS中的预解释的相关文章

实例讲解js中的预编译

js作为一本脚本语言,可以不经过编译直接运行,但遇到预编译的问题,尤其是变量或函数同名时,这点知识就尤其必要了.为了更好地了解js语言背后的运行机理.笔者采用实例化的方式讲解我理解的预编译.    理解预编译首先要弄清楚两种概念:函数声明和变量赋值. function ledi(){ }//函数声明 这种形式的写法是函数声明,即声明一个函数,脚本在执行之前会做预编译处理. var ledi= function(){ }//变量赋值   这种写法是变量赋值,函数在js语言里也是一种数据,匿名函数作

课程笔记:——javascript中的预解释2

in:检测某一个属性是否属于这个对象(既可以检测私有的属性,也可以检测公有的属性) --> attr in obj 1.不管条件是否成立,在预解释的时候,判断体中的带var和function的都要进行预解释window下的预解释: var a; -->a=undefined 我们在全局作用域下声明的变量不仅仅是全局变量,也相当于给window增加了一个叫做"a"的属性名 if (!("a" in window)) {//"a" in

课程笔记:——Javascript 中的预解释

1.预解释(变量提升):在当前作用域下,JS代码执行之前,浏览器首先会把所有带var和function关键字的进行提前的声明或者定义var num = 12;声明(declare): var num; -->声明的时候没有赋值,我们的默认值是undefined定义(defined): num=12; 2.带var和带function的预解释不一样:var:在预解释的时候,只声明未定义(只有代码执行的时候才会完成赋值定义)function:在预解释的时候,声明和定义一起完成了(当代码在执行到定义的

JS学习之预解释

预解释:在js中,代码从上到下执行之前,(浏览器默认)首先会把所有带var和function关键字的进行提前的声明或者定义声明(declare):相当于种树时候"挖坑" var num;(var一个变量) 只声明没有定义的时候,num的默认值是undefined定义(defined):相当于种树时候"栽树" num=12;(给变量赋值) 在预解释的时候,带var和带function的还不一样:var:只是提前的声明(定义赋值的部分是在代码执行的时候完成的)funct

JS中的预编译(词法分析)阶段和执行阶段

javascript相对于其它语言来说是一种弱类型的语言,在其它如java语言中,程序的执行需要有编译的阶段,而在javascript中也有类似的“预编译阶段”(javascript的预编译是以代码块为范围<script></script>,即每遇到一个代码块都会进行  预编译>执行),了解javascript引擎的执行机理,将有助于在写js代码过程中的思路总结 首先科普下javascript中的两种声明方式,var和function,前者声明的是变量,后者声明的是方法 在预

js中Prototype属性解释及常用方法

1.prototype的定义 javascript中的每个对象都有prototype属性,Javascript中对象的prototype属性的解释是:返回对象类型原型的引用. 每一个构造函数都有一个属性叫做原型.这个属性非常有用:为一个特定类声明通用的变量或者函数. 你不需要显式地声明一个prototype属性,因为在每一个构造函数中都有它的存在.你可以看看下面的例子: function Test(){} alert(Test.prototype); // 输出 "Object" 1.

[js]js栈内存的全局/私有作用域,代码预解释

js代码如何执行的 浏览器提供执行环境: 全局作用域(提供js执行环境, 栈内存) --> 执行js需要预解释 - 带var : 提前声明 - 带function关键字的: 提前声明+定义 js中的栈内存(对应全局/私有作用域)和堆内存 <script> // 基本: num str boollen null undefied // 引用: [] {} \^$\ Date var num = 12; var obj = {name: "maotai", age: 22

预解释-基础

预解释(变量提升):在当前的作用域中,JS代码从上到下执行之前,浏览器会默认的先把所有带var/function关键字的进行提前的声明或者定义对带var变量的是提前声明(declare)对带function关键字的是提前定义(声明+定义)(defined) ->在预解释阶段,带var关键字的只是提前的声明,只有在JS从上到下执行的过程中才会进行定义赋值: 1 //->预解释阶段:告诉浏览器在当前的作用域中(window)有一个名字叫做num的变量:var num; 2 console.log(

吃透【预解释】,从此再也不用担心!

Author:李金涛 Form:光环国际 Time:2017-12-31 23:49(跨年夜的最后一刻,我在辛勤耕耘我的"预解释",收获满满,甚喜!) 定义:预解释(变量提升):js在运行前,先把所有带var和function关键字的提前声明或定义.且预解释是发生当前作用域下的. 1,全局预解释阶段: (1)全局作用域与全局变量:当浏览器加载HTML页面的时候,首先会提供一个供全局JavaScript代码执行的环境,称之为全局作用域(global/ window).在window全局作