from me: javascript的变量声明具有hoisting机制,它是JavaScript一个基础的知识点,也是一个比较容易犯错的点,平时在开发中,大大小小的项目都会遇到. 它是JavaScript引擎在执行的时候,把所有变量的声明都提升到当前作用域的最前面. 当然了,函数声明也是可以被提升的.然后,函数表达式却没有提升. 原文:Back to Basics: JavaScript Hoisting 译文:回归基础: JavaScript 变量提升 变量声明是所有的编程语言中最基础部分之…
js变量提升 对于大多数js开发者来说,变量提升可以说是一个非常常见的问题,但是可能很多人对其不是特别的了解.所以在此,我想来讲一讲. 先从一个简单的例子来入门: a = 2; var a; console.log(a); 你觉得以上的代码会输出什么?是输出undefined吗?如果是按照程序的自上而下执行的话,那么这一段代码确实是输出undefined.然而,javascript并不是严格的自上而下执行的语言. 这一段代码的输出结果是2,是不是感到很意外?为什么会这样呢?这个问题的关键就在于变…
1.首先理解函数作用域 在JavaScript中,变量的定义并不是以代码块作为作用域的,而是以函数作用作用域的.也就是说,如果变量是在某个函数中定义的,那么它在函数以外的地方是不可见的.而如果该变量是定义在if 或者for这样的代码块中,它在代码块之外是可见的.另外,在JavaScript中,术语"全局变量"指的是定义在所有函数之外的变量,与之相对的是"局部变量",所指的是在某个函数中的变量.其中,函数内的代码可以像访问自己的局部变量那样访问全局变量,反之则不行.…
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible"…
变量提升(Hoisting)的小案例 执行以下代码的结果是什么?为什么? 答案 这段代码的执行结果是undefined 和 2. 这个结果的原因是,变量和函数都被提升(hoisted) 到了函数体的顶部.因此,当打印变量a时,它虽存在于函数体(因为a已经被声明),但仍然是undefined.换言之,上面的代码等同于下面的代码:…
原谅链接:http://www.cnblogs.com/damonlan/archive/2012/07/01/2553425.html 因为这个问题很是经典,而且容易出错,所以在介绍一次.哈哈.莫怪哦. 一.案发现场 我们先看一段很简单的代码: var v='Hello World'; alert(v); 这个没有疑问吧,弹出“Hello World”.OK,我们继续. 我们在看一段Code: var v='Hello World'; (function(){ alert(v); })() 经…
变量提升(Hoisting):在ES6之前,函数声明和变量声明总是被JavaScript解释器隐式地提升(hoist)到包含他们的作用域的最顶端. 注意: 1. JavaScript 仅提升声明,而不提升初始化.2. ES6 中不存在变量提升的概念. 1. 变量提升 变量未声明: function fn () { console.log(name); } fn(); // 报错: ReferenceError: name is not defined 变量在使用后声明: function fn…
来看如下代码: function HelloJS(){ var array = [1,2,3,4,5]; for(var i in array){ } alert(i); } HelloJS(); alert(i); 此段代码运行后先执行HelloJS();,会先输出4,然后再执行alert(i);,执行alert(i);时会报i is not defined的错误. 根据变量提升,这段代码等同于如下代码: function HelloJS(){ var i: var array = [1,2,…
作用域(Scoping) javascript作用域之所以迷惑,是因为它程序语法本身长的像C家族的语言.我对作用域的理解是只会对某个范围产生作用,而不会对外产生影响的封闭空间.在这样的一些空间里,外部不能访问内部变量,但内部可以访问外部变量. c语言的变量分为全局变量和局部变量,全局变量的作用范围是任何文件和函数访问(当然,对于非变量定义的其他c文件,需要使用extern关键字进行申明,使用static关键字也可以将作用范围限定在当前文件中),局部变量的作用范围就是从申明到最近的大括号涵盖的块级…
提升是一种将变量和函数的声明移到函数作用域(如果不在任何函数内的话就是全局作用域)最顶部的机制. 提升影响了变量的生命周期,一个变量的生命周期包含3个阶段: 声明——创建一个新变量,例如var myValue: 初始化——用一个值初始化变量,例如myValue=150: 使用——使用变量的值,例如alert(myValue). javascript并没有严格遵循这个顺序,因此提供了更多的灵活性.比如:函数的使用可以在声明之前. 这是因为javascript的函数声明会被提升到作用域顶部. 变量提…
a = 'ghostwu'; var a; console.log( a ); 在我没有讲什么是变量提升,以及变量提升的规则之前, 或者你没有学习过变量提升,如果按照现有的javascript理解, 对于上述的例子,你可能会认为第3行代码的输出结果应该是undefined,  因为第二行是var a; 声明变量,但是没有赋值,所以a的值是undefined, 但是正确的结果是ghostwu. 至于为什么,请继续往下看! console.log( a ); var a = 'ghostwu'; 对…
我们先来看一道面试题,大家猜想一下,下面这段代码,打印出来的结果是什么 var name = 'World!'; (function () { if (typeof name === 'undefined') { var name = 'Jack'; console.log('Goodbye ' + name); } else { console.log('Hello ' + name); } })(); 这里打印出来的结果为什么是 Goodbye Jack, 而不是Hello World呢.…
变量在程序中随处可见.它们是一些始终在相互影响,相互作用的的数据和逻辑.正是这些互动使应用程序活了起来. 在JavaScript中使用变量很重要的一方面就是变量的提升 —— 它决定了一个变量何时可以被你的代码使用.如果你在寻找关于这方面的详细介绍,那你算是来对地方了.让我们一起看看吧. 1. 简介   提升是一种将变量和函数的声明移到函数作用域(如果不在任何函数内的话就是全局作用域)最顶部的机制. 提升影响了变量的生命周期,一个变量的生命周期包含3个阶段: 声明 - 创建一个新变量,例如var…
变量在程序中随处可见.它们是一些始终在相互影响,相互作用的的数据和逻辑.正是这些互动使应用程序活了起来. 在JavaScript中使用变量很重要的一方面就是变量的提升 —— 它决定了一个变量何时可以被你的代码使用.如果你在寻找关于这方面的详细介绍,那你算是来对地方了.让我们一起看看吧. 1. 简介 提升是一种将变量和函数的声明移到函数作用域(如果不在任何函数内的话就是全局作用域)最顶部的机制. 提升影响了变量的生命周期,一个变量的生命周期包含3个阶段: 声明 - 创建一个新变量,例如var my…
在写javascript代码的时候,经常会碰到一些奇怪的问题,例如: console.log(typeof hello); var hello = 123;//变量 function hello(){//函数声明 } console.log(typeof hello); var hello = function(){//函数表达式 } console.log(typeof hello);//function number function 对于为什么会是这样的一个结果:function numb…
今天在知乎看前端面试题的时候,看到这样的问题,发现自己懂的真的是太少了,看了给的例子,所以写一下自己的理解. 首先放一段代码: var v= “hello JavaScript”; alert(v); 很明显,这样的是会弹出对话框: 将alert(v)写到一个函数中: var v= “hello JavaScript”; function test(){ alert(v); }; test(); 这样弹出的结果肯定也是和第一个一样:那么下面这种方式输出的结果是什么? var bar=1; fun…
第一篇文章中提到了变量的提升,所以今天就来介绍一下变量提升和函数提升.这个知识点可谓是老生常谈了,不过其中有些细节方面博主很想借此机会,好好总结一下. 今天主要介绍以下几点: 1. 变量提升 2. 函数提升 3. 为什么要进行提升 4. 最佳实践 那么,我们就开始进入主题吧. 1. 变量提升 通常JS引擎会在正式执行之前先进行一次预编译,在这个过程中,首先将变量声明及函数声明提升至当前作用域的顶端,然后进行接下来的处理.(注:当前流行的JS引擎大都对源码进行了编译,由于引擎的不同,编译形式也会有…
其实我只是想复习下变量提升的,然后看到了函数提升,然后再看到了函数声明.函数表达式. 有必要怀着敬仰之心提及园子里的TOM大叔的解密命名函数表达式,不愧是大叔,好好地脑补了下基础知识. 在ECMAScript中,创建函数的最常用的两个方法是函数表达式和函数声明,两者期间的区别是有点晕,因为ECMA规范只明确了一点:函数声明必须带有标示符(Identifier)(就是大家常说的函数名称),而函数表达式则可以省略这个标示符: 函数声明: function 函数名称 (参数:可选){ 函数体 } 函数…
变量提升 先说三句总结性的话: let 的「创建」过程被提升了,但是初始化没有提升. var 的「创建」和「初始化」都被提升了. function 的「创建」「初始化」和「赋值」都被提升了. 所以,我们要注意,这三种变量提升,含义是不同的. 变量提升的规律 在进入一个执行上下文后,先把 var 和 function 声明的变量前置,再去顺序执行代码. PS:作用域分为全局作用域和函数作用域,用var声明的变量,只在自己所在的所用域有效. 我们举例来看看下面的代码. 代码 1: console.l…
变量提升 先说三句总结性的话: let 的「创建」过程被提升了,但是初始化没有提升. var 的「创建」和「初始化」都被提升了. function 的「创建」「初始化」和「赋值」都被提升了. 所以,我们要注意,这三种变量提升,含义是不同的. 变量提升的规律 在进入一个执行上下文后,先把 var 和 function 声明的变量前置,再去顺序执行代码. PS:作用域分为全局作用域和函数作用域,用var声明的变量,只在自己所在的所用域有效. 我们举例来看看下面的代码. 代码 1: console.l…
var:变量提升(无论声明在何处,都会被提至其所在作用域的顶部) let:无变量提升(所在的块内,未到let声明时(即let声明之前),是无法访问该变量的(not defined)),let变量不能重复声明(报错has already been declared) const:无变量提升,声明一个基本类型的时候为常量,不可修改:声明对象可以修改 <script> var a = 1; function fn() { console.log(a)//undefined a = 2; consol…
JavaScript引擎在预编译时,会将声明(函数声明.变量声明)自动提升至函数或全局代码的顶部.但是赋值不会提升. Because variable declarations (and declarations in general) are processed before any code is executed, declaring a variable anywhere in the code is equivalent to declaring it at the top. This…
废话不说,直接上代码(这是在JavaScript面对对象编程指南上面看到的一个例子) var a=123; function f(){ alert(a); var a=1; alert(a); } f(); 书上的解释是这样的:当JavaScript执行过程进入新函数时,这个函数内被声明的所有变量都会被移动导到函数最开始的地方.这种现象叫做提升.且被提升的只有变量的声明. 上面这个例子可以等价于: var a=123;function f(){ var a; alert(a); a=1; ale…
直接先看两段代码 function getSum() { var sum = a + b; var a = 1; var b = 2; return sum; } getSum(); function getSum() { var sum = a + b; a = 1; b = 2; return sum; } getSum(); 大家能够先看一下这两段代码的异同,并推断一下运行后分别得到的结果. 在运行第一段代码时,得到的NaN,这是由于在函数中变量声明被提升的结果.在运行"sum = a +…
JavaScript 是我们网页设计师必备的技能之一.我们主要用javascript来写的是网页特效.我们从零基础开始学习javascript入门. 但是,好的同学刚开始不知道怎么学习,接触js,因此,小强老师给大家写了这篇入门的javascript文章.从零基础开始学习js,使大家入门更简单,希望大家喜欢.JavaScript是一种脚本语言. 也是我们web网络中最为流行一种脚本语言.脚本语言:     1.不是独立存在的.需要依附.js就是依附在浏览器中.     2.脚本语言也是语言,也有…
请看如下代码: console.log(a); var a = 2; 输入结果会是什么?  请说出理由 可能会有三种答案: 1.2 2.抛出ReferenceError异常 3.undifined 对于编译器来说 var a = 2; 这一条语句其实是两条 : var a; 和 a = 2; 在编译过程中会先执行所有的声明,包括 var a; 当程序执行到第二行时再执行的 a = 2; 所以输入的结果应该是undifined;…
前段时间阿里实习生内推,一面就被刷了,也是郁闷.今天系统给发通知,大致意思就是内推环节不足以了解彼此,还可以参加笔试,于是赶紧再投一次.官网流程显示笔试时间3月31日,时间快到了,开始刷题.网上搜了一下去年题目,我擦,第一题就不会(伤心中...),继续往下看,第四题也不会...好嘛,搜答案吧.搜了一个多小时的博客,结合自己的理解,写下了这篇博文... 2014年阿里巴巴前端工程师笔试题目1: var v = "Hello world"; (function() { console.lo…
JavaScript代码的运行规则 在JavaScript代码运行之前其实是有一个编译阶段的.编译之后才是从上到下,一行一行解释执行.这样一来也给初学者造成很大的误解.初学者会觉得JavaScript的代码是从上到下,一行一行的解释执行的.按这样的思路,在有些情况下就会造成惨案: name = "W3cplus"; var name; console.log(name); 按照代码从上到下一行一行解释执行的说法,有些同学可能会觉得console.log(name)输出的值是undefi…
1.什么是变量提升 所谓的变量提升指的是:函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体(作用域)的最顶部. //先声明后使用 var x; console.log(x);// undefined //先试用后声明 console.log(y);// undefined var y; //上面的式子可以写成下面的样子 变量提升:把x,y提升到顶部 var x; var y; console.log(x); console.log(y); ①变量的使用有两种形式,先声明再使用或…
javascript变量提升 首先我们来看两个例子 var a = 1; function test(){ if(!a) var a = 10 alert(a) } test() //结果是10 是不是回有一些困惑,那么我们再来看下一个例子 var a = 1; function test(){ a = 10 return; function a (){} } test() alert(a)//结果是1 咦,是不是很神奇,当然如果你了解过javascript的scoping,那就另当别论了.这就…