javascript闭包、变量提升

一、add(2)(3)求和函数(闭包)

1 function add(x) {
2     var a = x;
3     return function(b) {
4         sum = a + b;
5         console.log(sum);
6     }
7 }
8 add(2)(3);        //5

二、变量提升

 1 //第一种情况
 2
 3 var a = 100; //全局变量
 4
 5 function test() {
 6     alert(a);        //向上搜索全局变量 -->100
 7     a = 10;          //没有var修饰,所以a为全局变量,覆盖之前的全局变量
 8     alert(a);        //  -->10
 9 }
10
11 test();
1 //第二种情况
2 var a = 100;
3 function test() {
4     alert(a);        //变量提升,  undefined
5     var a = 10;
6     alert(a);        //10
7 }
8 test();
 1 //第三种情况
 2 var a = 100;
 3 function test() {
 4     alert(a);       //变量提升,   undefined
 5     a = 10;
 6     alert(a);       //10
 7     var a;
 8     alert(a);       //10
 9 }
10 test();

三、看代码,给输出结果

1 for( var i = 1; i <= 3; i++) {
2     setTimeout(function() {
3         console.log(i);
4     },0);
5 };
6 // 4  4  4
1 for(var i = 1; i <= 3; i++) {
2     setTimeout((function(a) {
3         console.log(a);
4     })(i),0);
5 };
6 // 1  2  3

或者

1 for(var i = 0; i < 3; i++) {
2     setTimeout(function() {
3         console.log(i);
4     },0);
5     console.log(i);
6 }
7 // 0  1  2  3  3  3
1 for(var i = 0; i < 3; i++) {
2     setTimeout((function(n) {
3         console.log(n);
4     })(i),0);
5     console.log(i);
6 }
7 // 0  0  1  1  2  2
1 for(var i = 0; i < 3; i++) {
2     setTimeout((function(n) { return function(){
3         console.log(n);
4     };})(i),0);
5     console.log(i);
6 }
7 // 0  1  2  0  1  2

原文地址:https://www.cnblogs.com/songya/p/8625183.html

时间: 2024-08-30 07:14:31

javascript闭包、变量提升的相关文章

关于Javascript的“变量提升”

先来看一段代码: var a = 1;   function b() {       a = 10;       return;       function a() {}   }   b();   alert(a); // the result is : 1 如果你觉得结果是"1"有点出乎意外,那么你应该往下看: 我们知道一个function里面是一个封闭的作用域,在其中用var或者function xxx的形式声明的变量或者函数,在封闭作用域中是不会受外部影响的.如果functio

javascript Hoisting变量提升

1. 看人家举的两个例子,我认为这里的判断是否定义: !var 其实就是 指是否在函数function里面定义了.只有在funciton里面定义了了,js才hoist到最上面去找这个变量的值,否则就按照你自己在函数里定义的规则来了. [转载请注明来自: http://blog.csdn.NET/sunxing007] 下面的程序是什么结果? [javascript] view plain copy var foo = 1; function bar() { if (!foo) { var foo

JavaScript中变量提升------Hoisting

本文转自 damonlan的文章 http://www.cnblogs.com/damonlan/archive/2012/07/01/2553425.html 前言 因为我在写这文章的时候,百度里找资料,找到了园友的一篇文章,写的很好,可是我写了又不想放弃,所以就在里面拿了很多东西过来!~~ [翻译]JavaScript Scoping and Hoisting 希望得到大家谅解. 因为这个问题很是经典,而且容易出错,所以在介绍一次.哈哈.莫怪哦. 一.案发现场 我们先看一段很简单的代码: v

Javascript 的变量提升与预解析

一.什么是变量提升 在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分 二.怎么实现变量提升 Js 运行前有一个预编译的过程,预编译完成后,在一步步执行.那么在预编译的过程中,会执行三个动作: 1.分析参数, 2.分析变量声明, 3.分析函数声明. 具体步骤如下: 1.函数在运行的瞬间,生成一个活动对象(Active Object),简称 AO 2.分析参数 函数先接收形参,添加到

Javascript中变量提升的问题

一.函数声明变量提升 函数声明具有变量提升的问题,所以在函数被声明之前就可以访问. //else中的语句相当于将if中的function重写,因此无论flag为何值,返回的方法始终为重写后的方法. //将方法赋值给一个变量,方法就不会被重写,因此才能得到正确的结果. function functions(flag) { if (flag) { function getValue() { return 'a'; } } else { function getValue() { return 'b'

javascript 的变量提升特性

JavaScript 会提升变量声明.这意味着 var 表达式和 function 声明都将会被提升到当前作用域的顶部. bar(); var bar = function() {}; var someValue = 42; test(); function test(data) { if (false) { goo = 1; } else { var goo = 2; } for(var i = 0; i < 100; i++) { var e = data[i]; } } 上面代码在运行之前

初识javascript 闭包和变量提升

先上一小段代码: 1 function outFun(){ 2 var num = 2; 3 function inFun(){ 4 console.log(num); 5 } 6 return inFun; 7 } 8 var out = outFun(); 9 out();//2,这里能够访问,其实是把num这个变量往上面一层提升了一下,out()往里面执行了一层.刚刚好在同一层. 10 console.log(num);//浏览器报错,不能访问outFun函数里面的局部变量num 敲黑板,

浏览器中的 JavaScript执行机制:07 | 变量提升:JavaScript代码是按顺序执行的吗?

前言:该篇说明:请见 说明 —— 浏览器工作原理与实践 目录 讲解完宏观视角下的浏览器后,从这篇文章开始,我们就进入下一个新的模块了,这里我会对 JavaScript 执行原理做深入介绍. 今天在该模块的第一篇文章,我们主要讲解执行上下文相关的内容.那为什么先讲执行上下文呢?它这么重要吗?可以这么说,只有理解了 JavaScript 的执行上下文,你才能更好地理解 JavaScript 语言本身,比如变量提升.作用域和闭包等.不仅如此,理解执行上下文和调用栈的概念还能助你成为一名更合格的前端开发

JavaScript变量提升及作用域

今天在知乎看前端面试题的时候,看到这样的问题,发现自己懂的真的是太少了,看了给的例子,所以写一下自己的理解. 首先放一段代码: var v= "hello JavaScript"; alert(v); 很明显,这样的是会弹出对话框: 将alert(v)写到一个函数中: var v= "hello JavaScript"; function test(){ alert(v); }; test(); 这样弹出的结果肯定也是和第一个一样:那么下面这种方式输出的结果是什么?