js-预编译就是那个鬼

今天的之前只知道函数表达式这样写,而且要写到函数调用之前,不然会报错。也是像这样做的,所以没遇到什么问题。

var functionName = function(){

            alert("我是函数表达式");
        } 

函数声明这样写,既可以写到函数调用的前边也可以是后边,就是因为有一个函数声明的提升。具体何为函数提升,母鸡啦。。。
function functionName(){
            alert("我是函数声明");
        }

刚刚看了一道题的解释才明白。(不懂的太多呀。)

js的运行机制如下:

1、首先是“预编译”,对当前执行环境创建一个活动对象,并将用var声明的变量设置为活动对象的属性,不过这个时候声明的变量被赋值为undefined;将以function定义的函数也添加为活动对象的属性,并且它们的值是此函数的定义。


2、其次是“解释执行”,当在某个执行环境中要对遇到的var变量进行解析时,搜索会从作用域链的前端开始,向上逐级查询与给定的变量名匹配的属性。如果在局部环境中找到了与该变量匹配的属性,搜索停止,变量赋值。如果在局部环境中没有找到该变量名,则继续沿作用域链向上搜索。搜索过程将一直追溯到全局环境的变量对象。如果全局环境中也没有找到,则该变量就是没有声明。此时这个变量的值为预编译时的undefined。


到此,很明了的可以解释为什么函数表达式一定要写到函数调用的前边了。如果写到后边,在预编译阶段会直接将函数名称编译为undefined,到函数调用那一步,理所应当的就为undefined了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值