javascript var变量删除

var有三种声明的情形:

  1. var声明的全局变量
  2. var在函数范围内声明的局部变量
  3. eval中声明的全局变量。

首先,

1、2种情形var声明的变量是无法删除的。

尽管var声明的全局变量是属于window对象的属性(在浏览器中),但依然是无法删除的,因为这种属性的configurable=false,因此不能delete掉。

局部变量就更不用说了,连var变量依附的对象都不知道在哪里,肯定无法删除。

而eval(‘var a = 1‘)看似和直接var是一样的效果(当然是在全局作用执行eval),执行完也会在window对象上创建一个a属性,但是这个属性的configurable=true,因此可以删除。

<script type="text/javascript">
    var a = 1;
    console.log(Object.getOwnPropertyDescriptor(window, ‘a‘));      //false
    aa=1;
    console.log(Object.getOwnPropertyDescriptor(window, ‘aa‘));    //true
    with({}) {
        var b = 1;
        console.log(Object.getOwnPropertyDescriptor(window, ‘b‘));  //false
        console.log(delete b);
    }
    eval(‘var c = 1‘);
    console.log(Object.getOwnPropertyDescriptor(window, ‘c‘));     //true
</script>

函数不能被delete掉

局部作用域中的函数也不能被delete掉

本文作者starof,因知识本身在变化,作者也在不断学习成长,文章内容也不定时更新,为避免误导读者,方便追根溯源,请诸位转载注明出处:http://www.cnblogs.com/starof/p/4904929.html有问题欢迎与我讨论,共同进步。

时间: 2024-11-07 19:09:48

javascript var变量删除的相关文章

JavaScript中变量声明有var和没var的区别

本文来论述JavaScript中变量声明有var和没var的区别,关于Js中的变量声明的作用域是以函数为单位,所以我们经常见到避免全局变量污染的方法是 (function(){ ... })(): 在函数内部,有var和没var声明的变量是不一样的.有var声明的是局部变量,没var的,声明的全局变量. 在全局作用域内声明变量时,有var 和没var看起来都一样,我们知道,声明的全局变量,就是window的属性,究竟是否一样,我们通过ECMAScrpit5提供的属性的特性查询方法,来发现之间的区

深入理解Javascript的var变量和闭包

今天无意间看到阮一峰校友写的一个关于ES6新特性let.let的出现,就是为了弥补var的不足.由此,写下这篇博客重新回顾一下Javascript老生常谈的闭包和它的一个作用域的诟病. 闭包的概念我就不说了,很多书上都又说明和解释,就是在一个函数内部可以访问函数外的上下文.今天重点来说以下var变量.因为平时开发的时候,如果不对这个关键字有一个很深刻的认识,很容易产生很多坑和错觉. 本文要阐明的观点是:由var定义的变量,它作用域在一个函数体内,而不是我们其他语言理解的大括号{ }内. 下面又几

JavaScript中var变量引用function与直接声明function

今天在h5开发app的过程中遇到了一个js问题,function的执行问题 在js中声明函数function有这两种方法 var A=function(){...} 或者 function A(){...} 第一种称之为变量引用函数,因为js允许函数作为一个值传递给变量,第二种是直接声明式函数 一直以为这两种没什么区别,然而,今天在使用过程中发现,当我使用第一种方式声明function的时候,如果如下这样: document.getElementById("xx").addEventL

javascript 释放变量

JavaScript 释放变量 在Javascript是可以使用"delete"来手动删除变量,通过这样的方法让GC(Garbage collection)来回收内存,但在JS中并不是所有的变量都可以被删除的. 1.var 声明的 全局变量"a" 在使用 "delete a" 后 输出值依然为 "1". 2.未使用var 声明的全局变量"b" 成为了  "window"的属性,在使用 &

JavaScript 中变量、作用域和内存问题的学习

这是我学习JavaScript的第二篇文章,之前做过几年的Java开发,发现JavaScript虽然也是面向对象的语言但是确实有很多不同之处.就本篇博客,主要学习总结一下最近学习到的JavaScript的知识,其中有些是网络上的,不过对于理解JavaScript,和在工作总是会很实用的,所以总结了下来: 那么就开始吧,首先是变量 在JavaScript中变量分为两种:一种是基本类型,基本类型值在内存中占用固定大小的空间,因此被保存在栈内存中.从一个变量向另一个变量复制基本类型的值,会创建这个值的

Javascript的变量与delete操作符

原文:http://charlee.li/javascript-variables-and-delete-operator.html 刚刚看到一篇好文(原文链接), 对Javascript中的delete操作符分析得很透彻.在这里简单地介绍一下内容. 虽然是一个小小的delete操作符,其行为却异常复杂. # Javascript的变量 实际上Javascript中,变量 = 对象属性,这是因为 Javascript 在执行脚本之前 会创建一个Global对象,所有的全局变量都是这个Global

Javascript教程:delete删除对象

在javascript中,我们有时候要使用delete删除对象.但是,对于delete的一些细节我们未必尽知.昨天,看到kangax分析delete的文章,获益匪浅.本文将文章的精华部分翻译出来,与各位分享. 原理 代码类型 执行上下文 激活对象/可变对象 属性特性 内置对象和DontDelete 未声明的赋值 Firebug 困惑 通过eval删除变量 浏览器兼容性 Gecko DontDelete bug IE bugs 误区 ‘delete’和宿主对象 ES5严格模式 总结 原理 为什么我

JavaScript的变量及作用域

JavaScript 的变量与其他语言的变量有很大区别. JavaScript 变量是松散型的(不强制类型)本质,决定了它只是在特定时间用于保存特定值的一个名字而已. 由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变. 一.基本类型和引用类型的值 1.ECMAScript 变量可能包含两种不同的数据类型的值:基本类型值和引用类型值. 2.基本类型值指的是那些保存在栈内存中的简单数据段,即这种值完全保存在内存中的一个位置. 3.而引用类型值则是指

JavaScript基础——变量、作用域和内存问题

按照ECMA-262的定义,JavaScript的变量与其他语言的变量有很大区别.JavaScript变量松散类型的本质,决定了它只是在特定时间用于保存特定值的一个名字而已.由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值即其数据类型可以在脚本的声明周期内改变.尽管从某种角度看,这可能是一个既有趣又强大,但同时又容易出问题的特性,但JavaScript变量实际的复杂程度远不止如此. 基本类型和引用类型的值 ECMAScript变量可能包含两种不同数据类型的值:基本类型和引用类型值.