zoukankan      html  css  js  c++  java
  • JavaScript中有var和没var的区别

    Js中的变量声明的作用域是以函数为单位,所以我们经常见到避免全局变量污染的方法是

    (function(){

        // ...

    })();

    在函数内部,有var和没var声明的变量是不一样的。有var声明的是局部变量,没var的,声明的全局变量,所以可以借此向外暴露接口东东。

    在全局作用域内声明变量时,有var 和没var看起来都一样,我们知道,声明的全局变量,就是window的属性,究竟是否一样,我们通过ECMAScrpit5提供的属性的特性查询方法,来发现之间的区别。

    var fff = 2;

    window.ffa = 3;

    ffb = 4;

    this.ffc = 4;

    var ffftx = Object.getOwnPropertyDescriptor(window, 'fff'); //configurable:false,enumerable:true,value:2,writable:true

    var ffatx = Object.getOwnPropertyDescriptor(window, 'ffa'); //configurable:true,enumerable:true,value:2,writable:true

    var ffbtx = Object.getOwnPropertyDescriptor(window, 'ffb'); //configurable:true,enumerable:true,value:2,writable:true

    var ffctx = Object.getOwnPropertyDescriptor(window, 'ffc'); //configurable:true,enumerable:true,value:2,writable:true

    通过上面,发现,原来还是有差别的,我们再用delete删除属性来验证下,配置性为false的属性无法删除。也就是通过变量var声明全局对象的属性无法删除,我们还会发现和函数声明创建的全局对象属性也无法删除。

    delete fff; // 无法删除

    delete ffa; // 可删除

    delete ffb; // 可删除

    delete ffc; // 可删除

    结论就是,加上var 和没加 var的声明全局变量是有区别的。

    使用var语句重复声明语句是合法且无害的。如果重复声明且带有赋值,那么就和一般的赋值语句没差别。如果尝试读取没有声明过的变量,Js会报错。

    JavaScript的函数作用域内,声明的变量或内部函数,在函数体内都是可见的。意味着,函数在定义之前可能已经可用。函数定义有两种方式,一种是函数定义表达式,一种是函数声明语句。

    // 函数定义表达式

    var fns = function (){

        // ...

    }

    // 函数声明语句

    function fns(){

        // ...

    }

    函数声明语句“被提前”到外部脚本或外部函数作用域的顶部,所以以这种方式声明的函数,可以被再它定义之前出现的代码所调用。而函数定义表达式中,变量的声明被提前了,但是给变量的赋值是不会提前的,所以,以表达式方式定义的函数在函数定义之前无法调用。

    (function() {

        testa(); // 打印出testa

        testb(); // 报错:提示undefined is not a function

        console.log(testc); //打印出testc

        function testa() {

            console.log("testa");

        }

        var testb = function() {

            console.log("tesb");

        }

        var testc = "testc";

    })();

    当然,我们声明变量和函数,必须遵守基本的规范,变量和函数声明要提前。

    以上函数定义,在《JavaScript权威指南》有涉及,借用了它的语句描述,此外http://www.cn-cuckoo.com/2008/12/26/on-javascript-function-271.html ,也有类似描述。

    Ps:蛮崇拜《JavaScrpt高级程序设计》翻译作者 李松峰,总是将JavaScript讲解的如此深透,不过,在上面链接博文中,你会发现作用域的名词又被李松峰大神随便用了,以前他写的关于原型的博文中看,作用域可不是这样定义了。

     本文首发 http://www.cnblogs.com/sprying/p/3197196.html

  • 相关阅读:
    VisualSVN-Server windows 版安装时报错 "Service 'VisualSVN Server' failed to start. Please check VisualSVN Server log in Event Viewer for more details."
    Pytest 单元测试框架之初始化和清除环境
    Pytest 单元测试框架入门
    Python(email 邮件收发)
    Python(minidom 模块)
    Python(csv 模块)
    禅道简介
    2020年最好的WooCommerce主题
    Shopify网上开店教程(2020版)
    WooCommerce VS Magento 2020:哪个跨境电商自建站软件更好?
  • 原文地址:https://www.cnblogs.com/sprying/p/3197196.html
Copyright © 2011-2022 走看看