变量的作用域

变量的作用域

在JavaScript中,let定义的变量实际上是有作用域的。 假设在函数体中声明,则在函数体外不可以使用

 

function y(){
        let x = 5;
        x = x+2;
    }
    x = x +1;//ReferenceError: x is not defined

如果两个函数使用了相同的变量名,只要在函数内部,就不冲突

function y(){
        let x = 5;
        x = x+2;
    }
    function y2(){
        let x = 'a';
        x = x+1;
    }

内部函数可以访问外部函数的成员,反之则不行

unction q(){
        let q = 1;
        //内部函数可以访问外部函数的成员,反之则不行
        function q2(){
            let w = q+2;
        }
        let e = w + 3;//Uncaught ReferenceError: w is not defined
    }

假设,内部函数变量和外部函数的变量,重名!

复制代码
function a(){
        let x = 5;
        function aa(){
            let x = 'A';
            console.log('inner'+x);//innerA
        }
        console.log('outer'+x);//outer5
        aa();
    }
复制代码

假设在JavaScript中函数查找变量从自身函数开始~,由内向外查找。假设外部存在这个同名的函数变量,则内部函数会屏蔽外部函数的变量

提升变量的作用域

function b(){
        var x = 'xx' + yy;
        console.log(x);
        var yy = 'y';
    }

结果:xundefined

在使用let以及const声明变量不会提升,所以就会抛错,而使用var声明的变量,会声明提升,所以会打印出undefined!!! 说明:js执行引擎,自动提升了y的声明,但是不会提升变量y的赋值

function b2(){
        var y;
        var x = 'x' + y;
        console.log(x);
        y = 'y';
    }

这个是在JavaScript建立之初就存在的特性。养成规范:所有的变量定义都放在函数的头部,不要乱放,便于代码维护

function c(){
        var a = 1,
            b = 2,
            c = 3,
            z,x;
        //之后随意用
    } 

全局函数

//全局变量
let m = 1;
    function abc(){
        console.log(m);
    }
    abc();
    console.log(m);

全局对象 window

var x='xxx';
    alert(x);
    alert(window.x);//默认所有的全局变量,都会自动绑定在window对象下

alert()这个函数本身也是一个window变量

复制代码
  var x='xxx';
    window.alert(x);
    var old_alert = window.alert;
    // old_alert(x);
    window.alert = function (){

    }
    //发现alert()失效了
    window.alert(123);
    //恢复
    window.alert = old_alert;
    window.alert(456);
复制代码

JavaScript实际上只有一个全局作用域,任何变量(函数也可以视为变量),假设没有在函数作用范围内找到,就会向外查找,如果在全局作用域都没有找到,报错ReferenceError

规范

由于我们所有的全局变量都会绑定到我们的window上,如果不同的js文件,使用了相同的全局变量,冲突->如何能够减少冲突?

 //唯一全局变量
    var yang = {};
    //定义全局变量
    yang.name = '杨不悔';
    yang.add = function (a,b){
        return a + b;
    }

把自己的代码全部放入自己定义的唯一空间名字中,降低全局命名冲突的问题~ jQuery

局部作用域 let

 function aaa(){
        for (var i = 0; i < 100; i++) {
            console.log(i);
        }
        console.log(i+1);//问题? i 出了这个作用域还可以使用
    }

ES6 let 关键字,解决局部作用域冲突问题!

function bbb(){
        for (let i = 0; i < 100; i++) {
            console.log(i);
        }
        console.log(i+1);//ReferenceError: i is not defined
    }

建议大家都是用let去定义局部作用域的变量

常量 const

在ES6之前,怎么定义常量:只要全部用大写字母命名的变量就是常量,建议不要修改这样的值

var PI = '3.14';
    console.log(PI);
    PI = '123';//可以改变这个值
    console.log(PI);

在ES6中引入了常量关键字const

 const AS = '3.14';//只读变量
    console.log(AS);
    AS = '5';//TypeError: Assignment to constant variable.
    console.log(AS);

 

 

posted @   少时凌云志  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示