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,超全面'

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

  • 相关阅读:
    'Undefined symbols for architecture i386,clang: error: linker command failed with exit code 1
    The codesign tool requires there only be one 解决办法
    XCode iOS project only shows “My Mac 64bit” but not simulator or device
    Provisioning profile XXXX can't be found 的解决办法
    UIView 中的控件事件穿透 Passthrough 的实现
    Xcode4.5出现时的OC新语法
    xcode 快捷键(持续更新)
    打越狱包
    php缓存与加速分析与汇总
    浏览器的判断
  • 原文地址:https://www.cnblogs.com/painsOnline/p/5104534.html
Copyright © 2011-2022 走看看