• 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

  • 相关阅读:
    你所不知道的 C# 中的细节
    数据分析与数据挖掘 ---- 系列教程
    Tiny Core Linux 安装配置
    Debian 安装
    基于C#的内网穿透学习笔记(附源码)
    Layui前端框架介绍
    使用 C# 捕获进程输出
    sonar扫描——方法重构分析
    消除代码中的坏味道,编写高质量代码
    TensorFlow之张量
  • 原文地址:https://www.cnblogs.com/sprying/p/3197196.html
Copyright © 2020-2023  润新知