zoukankan      html  css  js  c++  java
  • javascript 中加’var‘和不加'var'的区别,你真的懂吗?

    没看之前千万别说我是标题党,这个问题真的有好多淫都不懂!!!

    大家都看了很多文章,都说避免隐式声明全局变量,就是说声明变量前必须加'var',那加了'var'和不加'var'到底有啥区别呢?

     先来看一段代码

    var a = 'aa';
    alert(a); //弹出 'aa'
    alert(window.a)//弹出'aa'

    明白了吧,你声明一个全局变量其实是给'window'对象增加了一个属性,下面一段代码有相同效果

    a = 'aa';
    alert(a); //弹出 'aa'
    alert(window.a)//弹出'aa'

    那"var a = 'aa' " 和 "a = 'aa' " 都是全局变量,有啥区别了? 看下面两段段代码

    var a = 'aa';
    delete window.a; // false
    a = 'aa';
    delete window.a; // true

    都是为'window'对象增加了属性,一个可以删除,一个不能删除。但是加上'var'就可以作用域相关了,不加'var'始终都是在为'window'对象动态添加属性,以下代码为证

    var test = function(){
     a = 'aa';
    }
    
    test();
    
    alert(window.a);//弹出'aa'

     由于window对象是全局对象,因此默认可以不加,下面这段同样效果

    var test = function(){
     a = 'aa';
    }
    
    test();
    
    alert(a);//弹出'aa'

    说到这,认真思考的同学现在必然有个疑问, 为啥隐式声明的全局变量可以删除,显式声明的全局变量就无法删除?

    原因是"delete 不可以删除那些可配置性为false的属性" ,某些内置对象的属性是不可配置的,比如通过变量声明或者函数声明创建的全局对象的属性,以下代码为证

    delete Object.prototype; // false 不可删除,该属性是不可配置的
    var a = 'aa';
    delete window.a;//false 不可删除,该属性是不可配置的
    function test(){};
    delete window.test;//false 不可删除,该属性是不可配置的

    那这样不就明白了,通过'var'声明的全局变量,其实际上是为'window'对象增加了一个不可配置的属性, 而不加'var'声明的全局变量,其实际上是为'window'对象增加了一个可以配置的属性。

    注意了,以上使用window的地方,window都可以用this代替,如:

    var test = function(){
     a = 'aa';
    }
    
    test();
    
    alert(this.a);//弹出'aa'

    至于原因,请查看鄙人之前写的文章 'this,this,再次讨论javascript中的this,超全面'

    鄙人才疏学浅,有不足之处,欢迎补足

  • 相关阅读:
    c标签页面进行解析json
    Android 简述touch事件中的MotionEvent
    R中读取文件,找不到路径问题 No such file or directory
    文章标题
    Codeforces Beta Round #2 C. Commentator problem
    openfire 开发遇到的些问题
    BZOJ 刷题记录 PART 5
    公司又裁人了……
    最简单的基于FFmpeg的移动端样例:Android 视频转码器
    单片机: 简易计算器的实现(键盘)
  • 原文地址:https://www.cnblogs.com/painsOnline/p/5104534.html
Copyright © 2011-2022 走看看