javas基础03——函数的作用域及变量提升

1.作用域

作用域,变量在函数内部作用的范围/区域。有函数的地方就有作用域。

2.局部作用域和全局作用域

function fn(){
        var a = 1;
    }
    console.log(a);    //报错:a is not defined
    用var声明的变量,实际上是有作用域的
    在函数内部定义的变量,该变量的作用域是整个函数体,在函数体外不可引用该变量,这是局部作用域

    变量的生命周期:
    1.永远存在----全局
        程序没关,一直占用内存,少用全局

    2.朝生暮死----局部
        函数的大括号开头到函数的大括号结尾

    var a = 1;
    function fn(){
        console.log(a);    //1
    }
    console.log(a);    //1
    不在任何函数内定义的变量就具有全局作用域。全局变量在任何地方都能调用。

    作用域的处理方式:利用匿名函数生成一个局部作用,把变量的声明和使用这个变量的小函数都放在匿名函数中

// 作用域:

// 生效的区域

// 变量生效的区域

// 区域:

// 全局:整个代码文件,不属于任何一个函数,就是全局

// 局部:每个函数都是一个局部

// 能不能跨作用域访问:

// 同级局部不能跨

// 父不能拿子,子能拿父

// 多个父子级作用域内都有,找最近的作用域

// 全局作用域下的变量,叫全局变量
    var a = 10;
    // 局部作用域下的变量,叫局部变量
    function fn(){
        var a = 20;
        console.log(a)
    }
    function fn1(){
        var a = 30;
        console.log(a)
    }
    function fn2(a){
        console.log(a)
    }
    fn();
    fn1();
    fn2("hello");
    // console.log(a);

    // 函数中的形参也是变量,形参也是当前函数的局部变量

3.声明提升

变量声明提升:
    console.log(a)        //undefined已经声明但是未赋值
    var  a = 2;
    console.log(a)        //2

    consoleo.log(b)       //not a defined未声明

    function fn(){
        console.log(a)    //undefined
        var a = 1;
    }
    fn();
    在函数fn()中,在没有定义变量之前打印a,得到undefined,而并不是not defined
    说明此时变量已经被声明,只是还没有被赋值。

    上面的fn()函数可以理解成
    function fn(){
        var a;
        console.log(a);
        a = 1;
    }
    fn();

    我们称这种现象为变量的声明提升,所有使用var声明的变量会在当前作用域最开始的部分被声明。   

函数的声明提升:整体提升

函数的声明提升:整体提升
    fn();        //2
    function fn(){
        console.log(2);
    }
    fn();        //2

------------------------------------
注意:
    console.log(fn);     //undefined
    fn();                //not a function
    var fn = function(){
        console.log(1);
    }
 function fn(){
        console.log(a);     //f2
        var a = "hello";
        console.log(a);     //"hello"
        function a(){1}
        console.log(a);     //"hello"
        a = "world";
        console.log(a);     //"world"
        function a(){2}
        console.log(a);     //"world"
    }
    // 以上代码等价于↓↓↓
    function fn(){
        var a;
        function a(){1}
        function a(){2}
        console.log(a);     //f2
        a = "hello";
        console.log(a);     //"hello"
        console.log(a);     //"hello"
        a = "world";
        console.log(a);     //"world"
        console.log(a);     //"world"
    }
    fn();

原文地址:https://www.cnblogs.com/wuziqiang/p/11968300.html

时间: 2024-10-15 04:12:46

javas基础03——函数的作用域及变量提升的相关文章

Javascript作用域和变量提升

下面的程序是什么结果? [javascript] view plain copy var foo = 1; function bar() { if (!foo) { var foo = 10; } alert(foo); } bar(); 结果是10: 那么下面这个呢? [javascript] view plain copy var a = 1; function b() { a = 10; return; function a() {} } b(); alert(a); 结果是1. 吓你一跳

作用域与变量提升的面试题方法总结

前言:下面的方法能快速的解面试题,主要针对=>作用域与变量提升的面试题.并且没有this改变指向的情况 (有错或者不足的地方,随时修改补充) 1.没有参数的时候:看有没有var,或者函数申明(也就是说如果有变量提升,函数体内就变成私有变量了,函数体内修改了不会影响父级.) 有,子集是undefined,也不会找父级,下面修改了(简单和复合类型)都不会影响父级. 没有,子集找不到,会找到父级,下面修改了(简单和复合类型)都会影响父级. 2.有参数的时候:(有传参,函数体内就变成私有变量了,函数体内

作用域、变量提升、函数提升、数据类型

一.作用域分类 (作用域范围内定义的变量,整个作用域都可以访问) 1. 全局作用域 使用var声明(或者不严格模式下没有声明)且在函数外定义的变量,其作用域范围是全局的,称其为全局作用域. 2. 函数作用域 使用var声明且在函数内部定义的变量,其作用域范围是整个函数,称其为函数作用域. 3. 块作用域(ES6) 使用let(或者const 常量)声明且在一个花括号(非函数)里面,其作用域范围就是这个花括号以内,称其为块作用域. 二.变量提升 (变量声明会提升至函数或者语句的最前面,位置还在其作

js 作用域,变量提升

先看下面一段代码: 1 var a = 0; 2 alert("1st alert : a = " + a); 3 function fun(){ 4 alert("2nd alert : a = " + a); 5 var a = 1; 6 setTimeout(function(){ 7 alert("3rd alert : a = " + a); 8 a = 2; 9 },1000); 10 a = 3; 11 setTimeout(fun

JS中作用域和变量提升(hoisting)的深入理解

作用域(Scoping) javascript作用域之所以迷惑,是因为它程序语法本身长的像C家族的语言.我对作用域的理解是只会对某个范围产生作用,而不会对外产生影响的封闭空间.在这样的一些空间里,外部不能访问内部变量,但内部可以访问外部变量. c语言的变量分为全局变量和局部变量,全局变量的作用范围是任何文件和函数访问(当然,对于非变量定义的其他c文件,需要使用extern关键字进行申明,使用static关键字也可以将作用范围限定在当前文件中),局部变量的作用范围就是从申明到最近的大括号涵盖的块级

js作用域和变量提升

Function declarations and variable declarations are always moved (“hoisted”) invisibly to the top of their containing scope by the JavaScript interpreter. example1 : var foo = 1; function bar() { if (!foo) { var foo = 10; } console.log(foo); // 10 }

JS基础-运算符-函数

1.运算符  1.赋值运算符和扩展运算符    1.赋值运算符 =    2.扩展运算符      +=,-=,*=,/=,%=,^=....      ex:        a=a+b;--> a+=b; a=a+1;--> a++,a+=1,++a      实现两个数字的换位:        a^=b; b^=a; a^=b;  2.条件运算符    条件运算符又称三目运算符.    单目(一元)运算符,只需要一个操作数或表达式.     ex:++,--,!    双目(二元)运算符,

深入理解js的变量提升和函数提升

一.变量提升 在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分.上个简历的例子如: 1 2 3 4 5 6 7 8 9 10 console.log(global); // undefined var global = 'global'; console.log(global); // global function fn () { console.log(a); // unde

函数和函数的作用域问题,arguments

this的值:在函数执行时,this关键字并不会指向正在运行的函数本身,而是指向调用该函数的对象.所以,如果你想在函数内部获取函数自身的引用,只能使用函数名或者使用argument.callee属性(严格模式下不可用),如果该函数是一个匿名函数,则你只能使用后者. 1.定义函数 三种方式: 1)函数声明 (function语句) function name([param[, param[, ... param]]]) { statements } name函数名. param函数的参数的名称,一