JavaScript没有块级作用域.在其他语言上,比如C语言中,有花括号封闭的代码块都有自己的作用域,(如果用ECMAScript的话来讲,就是他们自己的执行环境),因而支持根据条件来定义变量.例如,下面的代码效果 if (true) { var color = "blue"; } alert(color);//blue 这里是一个if语句中定义了一个变量color,如果是在C,C++或者Java中,color会在if执行后被销毁.但是在JavaScript中,if语句中的变量声明会…
在函数(方法)中声明的所有变量,他们在整个函数中都有定义 var scope="abc"; function f() { alert(scope); //显示undefine var scope="local"; alert(scope); //显示local } 原因:由于作用域规则的限制,输出的并不是abc.由于局部变量在真个函数体内都是有定义的,这就意味这在真个函数题中都隐藏了同名的全局变量 上面的例子和下面的效果相同: function f() { var…
垃圾回收: JavaScript中,开发者不必关心内存分配和回收的问题.这和Java语言相似.有一个垃圾自己主动回收机制.那么JavaScript内部到底是如何回收垃圾的呢? 使用标记回收法:就是说.离开作用域的值将被自己主动标记为能够回收.因此将在垃圾收集期间被删除. 标记删除是当前主流的垃圾收集算法,这样的算法的思想是给当前不使用的值加上标记,然后回收期内存. 关于作用域的知识,大家有须要能够再搜集一下资料学习,这里就不具体叙述了. 打个例如: function test(){ var co…
原文:你不知道的js系列 在第(二)节中提到的,标识符在作用域中声明,这些作用域就像是一个容器,一个嵌套一个,这个嵌套关系是在代码编写时定义的. 那么到底是什么产生了一个新的作用域,只有函数能做到吗?JavaScript 的其它代码结构能否创建一个作用域呢? 函数作用域 观察下面的代码: function foo(a) { var b = 2; // some code function bar() { // ... } // more code var c = 3; } 在这段代码中,fo…
原本只有函数作用域和全局作用域两种,这就导致出现很多不方便的地方: 1)for循环问题:在看js高程的时候,纠结在第七章好久,就是一个这样的实例 function createFunctions(){ var result = new Array(); for (var i = 0 ; i < 10 ; i ++){ result[i] = function (){ return i; } } return result; } 不管这段代码输出result[i]()中的i是几,结果都是10,这就…
很多语言中都有块级作用域,但JS没有,它使用var声明变量,以function来划分作用域,大括号“{}” 却限定不了var的作用域.用var声明的变量具有变量提升(declaration hoisting)的效果. ES6里增加了一个let,可以在{}, if, for里声明.用法同var,但作用域限定在块级,let声明的变量不存在变量提升. 示例1: 块级作用域 if function getVal(boo) { if (boo) { var val = 'red' // ... retur…
let声明变量 用法类似于var,但是所声明的变量只在let所在的代码块内有效. 1 . 在ES6环境下,let声明的变量不能在声明之前调用. 例: console.log(i); //会报错,这叫做暂时性死区,会提示 i 未定义 let i ; let不允许在变量还没声明完成前,赋值给其他变量,或者是自己 let a = a; //报错 应该先声明,再赋值 let a ; a = 1; 或者直接赋值 let a = 1; var b = b; //不会报错,但是会返回undefined,没有赋…