关于Javascript的“变量提升”

先来看一段代码:

var a = 1;  
function b() {  
    a = 10;  
    return;  
    function a() {}  
}  
b();  
alert(a); // the result is : 1

如果你觉得结果是“1”有点出乎意外,那么你应该往下看:

我们知道一个function里面是一个封闭的作用域,在其中用var或者function xxx的形式声明的变量或者函数,在封闭作用域中是不会受外部影响的。如果function b是这样的:

function b() {
  var a = 10;
  return;
  function a () {}
}

那结果是“1”就很好理解。

可是为什么当我们在函数体b内没有用var来声明变量a,变量a仍然属于函数体b内定义的内部变量呢?

诀窍就在function a() {}

采用function xxx形式来定义的xxx函数,会优先于作用域内其他声明。

在function b中,即使看起来已经return了、并没有执行到function a() {},但实际上它已被“提升”至更高到编译优先级,它比a=10更早生效,所以文章开始的那段代码与以下代码是等价的:

var a = 1;  
function b() {
    var a = function () {};
    a = 10;  
    return;
}  
b();  
alert(a); // the result is : 1

如果这样写的话,你应该就能很好地理解什么叫做“变量提升”了。

关于Javascript的“变量提升”

时间: 2024-08-10 09:55:43

关于Javascript的“变量提升”的相关文章

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变量提升及作用域

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

回归基础: JavaScript 变量提升

from me: javascript的变量声明具有hoisting机制,它是JavaScript一个基础的知识点,也是一个比较容易犯错的点,平时在开发中,大大小小的项目都会遇到. 它是JavaScript引擎在执行的时候,把所有变量的声明都提升到当前作用域的最前面. 当然了,函数声明也是可以被提升的.然后,函数表达式却没有提升. 原文:Back to Basics: JavaScript Hoisting 译文:回归基础: JavaScript 变量提升 变量声明是所有的编程语言中最基础部分之

Javascript作用域和变量提升

下面的程序是什么结果? [javascript] view plain copy var foo = 1; function bar() { if (!foo) { var foo = 10; } alert(foo); } bar(); 结果是10: 那么下面这个呢? [javascript] view plain copy var a = 1; function b() { a = 10; return; function a() {} } b(); alert(a); 结果是1. 吓你一跳

JavaScript系列文章:变量提升和函数提升

第一篇文章中提到了变量的提升,所以今天就来介绍一下变量提升和函数提升.这个知识点可谓是老生常谈了,不过其中有些细节方面博主很想借此机会,好好总结一下. 今天主要介绍以下几点: 1. 变量提升 2. 函数提升 3. 为什么要进行提升 4. 最佳实践 那么,我们就开始进入主题吧. 1. 变量提升 通常JS引擎会在正式执行之前先进行一次预编译,在这个过程中,首先将变量声明及函数声明提升至当前作用域的顶端,然后进行接下来的处理.(注:当前流行的JS引擎大都对源码进行了编译,由于引擎的不同,编译形式也会有