变量提升,函数提升概念及相关题

之前总是对变量提升,函数提升一知半解,随着时间的推移,理解的越来越深刻,接下来就写一写,有不对的地方请大家指出来。

1) 变量提升

1. 通过var定义(声明)的变量, 在定义语句之前就可以访问到
2. 值: undefined

console.log(a)//undefined
var a = 1111;
console.log(a)//1111

等同于

var a = undefined
console.log(a) //undefined
a = 1111;
console.log(a) //1111

即:变量提升。你在一个作用域任何一个地方声明变量,都会被提升到作用域开始

2) 函数提升

1. 通过function声明的函数, 在之前就可以直接调用
2. 值: 函数定义(对象)

例子:

(1)var和函数

<script>
     console.log(a)//function a(){}
     var a=1;
     console.log(a)//1
     function a(){   }
     console.log(a)//1
</script>

等同于以下代码:

其过程:变量a先声明,给a赋值为undefined,后来预编译函数function a(){}再声明;输出a为function a(){} ; 之后给a赋值为1;输出a为1

<script>
     var a;
     a = function a(){}
     console.log(a)//function a(){}
     a=1;
     console.log(a)//1
     console.log(a)//1
</script>

(2)var和函数参数

<script>
    var a=8;
    function fn(a,b){
        console.log(a)//undefined    当前函数作用域能够找到a,其值是undefined。 所以不会向外查找
        var a=10;
        console.log(a)//10
    }
    fn();
</script>
<script>
    function fn(a,b){
        console.log(a)//hello
        var a=10;
        console.log(a)//10
    }
    fn(‘hello‘);
</script>

调用fn的时候传入参数a,b。 a和b会预编译赋值undefined,调用fn,传入"hello", a就被赋值为hello。

函数里面变量a的默认值就是参数a的值了,输出a即参数a值。给a赋值为10,输出a为10。

<script>
    var a=1;
    function fn(a,b){
        console.log(a)//undefined  当前作用域能够找到a的
        a=2;
        console.log(a)//2
    }
    fn();
</script>
foo();
    function foo(){
        console.log("aaa");
    }
function foo(){
        console.log("aaa");
    }

    foo();
foo();
    var foo = function(){
        console.log("aaa");
    }

报错运行结果是: foo is not a function

原因是:js解析遇到 foo()时会默认当做函数来解析

var foo;
console.log(foo);  //undefined
foo(); //foo is not a function
 foo = function(){
        console.log("aaa");
    }

如果函数声明和变量声明使用同一变量名称,函数声明的优先级高于变量

函数,函数参数,var

<script>
    var a=10;
    function fn(a,b){
        console.log(a)//function a(){}   这里输出function a(){}, 不是参数a的值
        var a=10;
        console.log(a)//10
        function a(){}
        console.log(a)//10
    }
    fn(15);
</script>

fn里面有参数a,也有变量a,也有函数a,这种迷惑性更高。其实当你知道三者先后顺序之后就不迷惑了

经过测试,我发现:参数a会覆盖预编译变量a的默认值,如果有函数,函数会覆盖参数a的值,就是先后顺序而已。

函数形参声明--->函数声明---->变量声明

<script>
    a();//1
    var a = c = function() {
        console.log(2)
    };
    a();//2

    function a() {
        console.log(1)
    }
    a();//2
    (function(b) {
        b();//2    其实就是外部的a
        c();//2     c为什么是2? 也许有人以为这里会报错,其实不会。 原因就在于var b=c=xxx。  c相当于没有加var 不会预编译,这里c直接查找到外部作用域的c
        var b = c = function a() {
            console.log(3)
        }
        b()//3
    })(a);//走到这里 a已经被赋值表达式重新赋值
    c();//3 由于没加var 的原因 c已经被立即执行函数内部的赋值表达式改变了值 这里是3
</script>
console.log(typeof foo);
console.log(typeof bar);
console.log(typeof add); //函数的声明
function foo(){ alert(‘foo‘); } //命名函数表达式
var bar = function(){ alert(‘bar‘); }; // 函数表达式-匿名函数
var add = function(a,b){ return a+b; }

输出结果为 function  undefined  undefined

console.log(b);
console.log(b());
var b=1;
function b(){
    return 2;
}

输出结果为

function b(){
    return 2;
}

2

console.log(a)  // f a() { console.log(a) }
console.log(b) //undefined
function a() {
        console.log(a)
}
var b = function(){
        console.log(b)
}

原文地址:https://www.cnblogs.com/renzm0318/p/8966018.html

时间: 2025-01-05 20:36:08

变量提升,函数提升概念及相关题的相关文章

js 变量、函数提升

先简单理解下作用域的概念,方便对变量与函数提升的概念的理解 function foo() { var x = 1; if (x) { var x = 2; } console.log(x); } foo();// 2 结果为2,可见js中并没有块级作用域的概念 可以使用下面的方法创造自己的作用域,这样不会干扰到外部变量 function foo() { var x = 1; if (x) { (function() { var x = 2; }()); } console.log(x); } f

JavaScript 变量和函数提升问题总结

一 什么是JavaScript 变量提升? -- JS程序运行时, (a)变量的声明会被解释器"提升"到方法体内的顶部,初始化赋值操作不提升按顺序执行 (b)函数体内未声明的变量,解释器会在函数体外声明变量,成为全局变量 (c)声明过的函数,整个函数体会被解释器提升到方法体的顶部,初始化赋值操作按顺序执行 1-1 变量提升 eg:变量的声明提升,初始化赋值不提升. <script> console.log(a); // undefined var a=3; // 若没有va

js中的变量提升与函数提升

先看看一个简单的代码 var str='Hello World'; alert(str);//弹出 Hello World 再看一段代码: var v='Hello World'; (function(){ alert(v); })() //和我们预期的一样,还是弹出 Hello World 那么铺垫完了,继续coding var str='Hello World'; (function(){ alert(str); var str='I love coding...'; })() //出乎我们

278 执行上下文、执行上下文栈:变量提升与函数提升,执行上下文,执行上下文栈,全局执行上下文,函数执行上下文,练习题

变量提升与函数提升 变量提升: 在变量定义语句之前, 就可以访问到这个变量(undefined) 函数提升: 在函数定义语句之前, 就执行该函数 先有变量提升, 再有函数提升 变量声明提升.函数声明提升 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>01_变量声明提升.函数声明提升</title> &l

JavaScript系列文章:变量提升和函数提升

第一篇文章中提到了变量的提升,所以今天就来介绍一下变量提升和函数提升.这个知识点可谓是老生常谈了,不过其中有些细节方面博主很想借此机会,好好总结一下. 今天主要介绍以下几点: 1. 变量提升 2. 函数提升 3. 为什么要进行提升 4. 最佳实践 那么,我们就开始进入主题吧. 1. 变量提升 通常JS引擎会在正式执行之前先进行一次预编译,在这个过程中,首先将变量声明及函数声明提升至当前作用域的顶端,然后进行接下来的处理.(注:当前流行的JS引擎大都对源码进行了编译,由于引擎的不同,编译形式也会有

对javascript变量提升跟函数提升的理解

在写javascript代码的时候,经常会碰到一些奇怪的问题,例如: console.log(typeof hello); var hello = 123;//变量 function hello(){//函数声明 } console.log(typeof hello); var hello = function(){//函数表达式 } console.log(typeof hello);//function number function 对于为什么会是这样的一个结果:function numb

一个例子,变量提升和函数提升就是这么简单!

为啥要进行变量提升和函数提升? 引擎在读取js代码的过程中,分为两步.第一个步骤是整个js代码的解析读取,第二个步骤是执行. 在JS代码执行之前,浏览器的解析器在遇到 var 变量名 和function 整个函数 提升到当前作用域的最前面. 记住两句话 1.变量提升只会提升变量名的声明,而不会提升变量的赋值初始化. 2.函数提升的优先级大于变量提升的优先级,即函数提升在变量提升之上. 记住这两句话,就可以从容不迫的撸代码了! console.log(a); var a=1; console.lo

变量、函数 hoisting (提升,起重)

函数和变量在代码解析的时候,会提到作用域的最顶端,不过,函数和变量只会被提到 所在作用域 的最顶端. console.log(sofish); function sofish() {}; var sofish = 'ciao cc';//function sofish() {} 证明变量在顶端 变量.函数 hoisting (提升,起重),布布扣,bubuko.com

js变量提升和函数提升

变量,作为编程语言最基础的部分,每种语言的变量不尽相同,但又大径相庭.大部分编程语言的变量有块级作用域,如if.for.while... 但JavaScript不纯在块级作用域,而是函数作用域,并且有自己独有的特性--变量提升.(ES6新添加的let.const使其可以用块级作用域) 对于函数的变量访问时遵循作用域链的,即当前函数运行时会有一个当前作用域,当饮用某个变量时,会先查找当前作用域内是否存在该变量的定义,如果不存在则根据作用域链向上去查找父函数的作用域,有则拿来使用,没有则继续向上直到