美文网首页
js中预编译时的变量、函数提升

js中预编译时的变量、函数提升

作者: 毛毛_000e | 来源:发表于2019-05-27 16:20 被阅读0次

先看一段代码的运行结果:

console.log(foo)      // foo(){ }

var foo=1;                 

console.log(foo)    // 1

function foo(){  

}

console.log(foo)    //1

console.log(foo())   //TypeError:foo is not a function

为啥会这样呢?

在解释器解析js代码的过程中,有一个预编译的过程,会把需要用到的变量声明和函数声明提升到方法体的最顶部,并且还有优先顺序之分:参数>函数>变量。需要注意的是,我们平时写函数的时候有2种写法:1>函数表达式 var fn=function fn(){ }

2>函数声明式 function fn(){} ,只有第二种函数声明式才会被提升,并且函数的提升是整个函数体的提升,同时变量也是只有声明被提升了,赋值没有被提升。

所以上面这段代码可以看成是这样的:

function foo(){}

console.log(foo) //这时候打印出来的就是foo函数

var foo=1 //这时候foo被重新赋值,变成了数值1

console.log(foo)  //重写后的foo是1

console.log(foo)    //1,同上

console.log(foo())   //因为foo被重写后已经是个Number类型的了,所以她不是函数,就会报错啦

艾玛,刚刚看到了一个更骚的题:

var b=10;

(function b(){ 

b=20

console.log(b)  //ƒ b(){  b=20;  console.log(b) }

})()

1、IIFE(立即执行函数)中的函数是函数表达式,不是函数声明

2、IIFE的函数名只在函数内部有效,并且函数名的绑定是常量绑定

3、对于一个常量进行赋值,在strict模式下回报错,非strict模式下静默失败

所以,这里的b函数是一个相当于用const定义的常量,内部无法进行重新赋值,如果在严格模式下会报错

相关文章

  • 浏览器学习笔记-JS执行

    变量提升 变量提升原理浏览器对js是先编译后执行,在编译过程中,js中的变量声明会被提升到代码段落前面。函数声明和...

  • 前端的那些事(一):变量提升与函数提升

    前言 是不是经常遇到面试问你,为什么会变量提升,函数提升,它的行为又是什么? 解答 js程序编译有两个步骤: 预解...

  • js变量声明提升与函数表达式

    1.变量声明提升 js引擎会把变量声明与函数声明都提升到当前函数的顶部。eg: js引擎编译为 2.函数表达式 对...

  • js中预编译时的变量、函数提升

    先看一段代码的运行结果: console.log(foo) // foo(){ } var foo=1; ...

  • JS笔记 命名问题

    JS中函数和变量重名时,后声明的覆盖先声明的,后赋值的覆盖先赋值的。 变量提升和函数提升时,变量的声明是在函数的声...

  • JS中的提升

    JS中包含两种提升,变量提升和函数提升。 变量提升 变量提升只能是var或者function声明的变量或者函数,l...

  • 前端经典面试题合集(一)

    1.谈谈变量提升 考察点:js基础知识,js执行机制,变量的提升答:执行js代码时,会生成执行环境,在函数中的代码...

  • 作用域-变量和函数提升

    变量和函数的提升可以分成两步: 1 js先预解析:把变量和函数声明提升到作用域顶端,我理解的意思是在浏览器中找一些...

  • 2018-12-01

    js中括号操作属性 js函数 js换肤 变量和函数预解析 匿名函数 函数传参 函数return关键字 流程控制语句...

  • js 预编译

    js运行 一、语法分析 二、预编译函数声明整体提升变量声明提升;var a = 123; 这个叫变量声明加赋值;如...

网友评论

      本文标题:js中预编译时的变量、函数提升

      本文链接:https://www.haomeiwen.com/subject/xogctctx.html