在C/C++中,由花括号封闭的代码块都有自己的作用域,也就是块级作用域(私有作用域).而在javascript中则没有块级作用域,首先来看一段代码: function test(){ for(var i = 1 ; i <=5; i++){ //i alert(i); } //alert(i); //6 } */ //test(); 对于有块级作用域的语言来说,for语句中定义并初始化的变量i在循环外是无法访问的,而在javascript中,for语句中定义的变量i在循环结束后,依旧会存在于循环…
概述 函数是js中最常见的作用域单元, 声明在一个函数内部的变量或函数会在所处的作用域中隐藏起来, 这是有意为之的非常好的设计原则. 但是随着js的发展, 我们有了某个代码块(通常指{..}内部)隐藏变量或函数的需求, 这就是块级作用域的由来. 下面是不用es6实现块级作用域的三种方法, 供以后开发时参考, 相信对其他人也有用. IIFE IIFE, 即立即执行函数, 用一个函数作用域(闭包)来模拟块级作用域.示例如下: //es6中的块级作用域 {let a = 1; console.log(…
在java.C++等语言中,变量i在会在for循环的语句块中定义,循环一旦结束,变量i就会被销毁.可是在javaScript中,从定义开始,就可以在函数内部随处访问.比如 function output(){ for(var i=0; i<10; i++){ } alert(i); var i; //重新声明 alert(i); } javaScript会对后续i的声明视而不见,如果后续声明中有变量初始化还是会执行.可以使用匿名函数来模仿块级作用域,或者使用ES6的let命令. 用块级作用域的匿…
原本只有函数作用域和全局作用域两种,这就导致出现很多不方便的地方: 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,这就…
function functions(flag) { if (flag) { function getValue() { return 'a'; } } else { function getValue() { return 'b'; } } return getValue(); } console.log(function functions(true)); 请问这段代码会输出什么呢. 答案将永远是:b. 解释一下为什么,因为在js是没有块级作用域的,又因为函数声明提升的原因,上面的这段代码变…
1. 块作用域{ } <script type="text/javascript"> { var a = 1; console.log(a); // 1 } console.log(a); // 1 // 可见,通过var定义的变量可以跨块作用域访问到. (function A() { var b = 2; console.log(b); // 2 })(); // console.log(b); // 报错, // 可见,通过var定义的变量不能跨函数作用域访问到 if(…
简介:在JavaScript中没有块级作用域的概念.这意味这在块语句中定义的变量,实际上在包含函数中而非语句中创建的.证明代码如下: function outputNumbers(count){ for(var i=0;i<count;i++){ break; } alert(i); } outputNumbers(3); //输出:0 下面来分析上面这个函数,上面的函数中定义了一个for循环,在Java,C#,C++等语言中,变量i只会在for循环中有定义,循环一旦结束,变量i就会被销毁,可是…
  一.块级作用域的说明 在学习JavaScript的变量作用域之前,我们应当明确几点: a.JavaScript的变量作用域是基于其特有的作用域链的. b.JavaScript没有块级作用域. c.函数中声明的变量在整个函数中都有定义. javascript的变量作用域,与平时使用的类C语言不同,例如C#中的代码: static void Main(string[] args) { if(true) { ; } Console.WriteLine(number); } 这段代码进行编译,是无法…
学过 javascript 的都知道 javascript 里面没有块级作用域的概念,这就意味着在块语句中定义的变量,实际上是在包含函数中而非语句中创建的,看下面的例子: function outPutNumber(count) { for(var i = 0; i < count; i ++) { alert(i); } alert(i); //计数 } 上面的函数中定义了一个 for 循环,而变量 i 的初始值被设置为0.在 java.c++等语言中,变量 i 只在 for 循环中定义和使用…
作用域 对于有块级作用域的语言来说,for语句中定义并初始化的变量i在循环外是无法访问的. 而javascript没有块级作用域,for语句中定义的变量i在循环结束后,依旧会存在于循环外部的执行环境(作用域)中,在这里i的作用域是全局环境. 具体来说就是:使用var关键字声明变量时,这个变量会自动添加到距离最近的可用环境中.对于函数而言,这个最近的环境就是函数的局部环境.如果变量在未经声明的情况下被初始化,则该变量会被自动添加到全局环境. 不过有时候的确很需要块级作用域来解决一些问题,这时候我们…