之前一直觉会认为javascript代码执行是由上到下一行行执行的.自从看了<你不知道的JS>后发现这个观点并不完全正确.先来给大家举一个书本上的的例子: var a='hello world'; var a; console.log(a); 一开始我觉得输出的是undefined.但是真正的结果是hello world.带着疑问再看另外一段代码: console.log(a); var a='hello world'; 借鉴与上面的例子会认为会输出一个hello world,或者是抛出一…
JS代码在执行的时候会先找出执行代码中定义的变量和函数,对其进行声明. 例1:console.log(a); var a = 4; 此时输出undefined.a变量在执行console.log(a);这条语句之前就已经被定义了只是没有赋值.实际的执行顺序是:var a ; console.log(a);a=4; 例2:var a = 3; function fn(){ console.log(a); var a = 4; } fn(); 执行输出undefined.在执行fn()函数时由于变量…
1. 变量声明提升 先看以下代码: 1)var in_window = "a" in window; console.log(in_window); 2)var in_window = "a" in window; console.log(in_window); if(!("a" in window)) { var a = 1; } 3)var a; var in_window = "a" in window; console…
在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分. JS的解析过程分为两个阶段:预编译期(预处理)与执行期. 预编译期JS会对代码块中的所有声明的变量和函数进行处理(类似与C语言的编译),但需要注意的是此时处理函数的只是声明式函数,而且变量也只是进行了声明但未进行初始化以及赋值. console.log(a);//undefined if (!("a" in wind…
前段时间阿里实习生内推,一面就被刷了,也是郁闷.今天系统给发通知,大致意思就是内推环节不足以了解彼此,还可以参加笔试,于是赶紧再投一次.官网流程显示笔试时间3月31日,时间快到了,开始刷题.网上搜了一下去年题目,我擦,第一题就不会(伤心中...),继续往下看,第四题也不会...好嘛,搜答案吧.搜了一个多小时的博客,结合自己的理解,写下了这篇博文... 2014年阿里巴巴前端工程师笔试题目1: var v = "Hello world"; (function() { console.lo…
先来两个问题 很多时候,在直觉上,我们都会认为JS代码在执行时都是自上而下一行一行执行的,但是实际上,有一种情况会导致这个假设是错误的. a = 2; var a; console.log(a); 按照传统眼光,console.log(a)输出的应该是undefined,因为var a在a = 2之后.但是,输出的是2. 再看第二段代码: console.log(a); var a = 2; 有人会想到第一段代码,然后回答undefined.还有人会认为a在使用前未被声明,因此抛出Referen…
预编译四部曲 1.创建AO对象 2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined 3.将实参和形参统一 4.在函数体里面找函数声明,值赋予函数体 function fn(a){ console.log(a) //function a(){} var a = 123; console.log(a)//123 function a(){} console.log(a)//123 var b = function(){} console.log(b) //function()…
if (!("a" in window)) { var a = 1; } alert(a); 结果:undefined 分析: 首先,所有的全局变量都是window的属性,语句 var a = 1;等价于window.a = 1: 第二,所有的变量声明都在范围作用域的顶部,如: alert("a" in window); var a; 相当于: var a; alert("a" in window); 这是因为JavaScript引擎首先会扫墓所…
1.先来看两个题 var a = 1; foo1(); function foo1(){ console.log(a); //输出1 }; foo2(); var a = 1; function foo2(){ console.log(a); //输出undefined }; 首先这两题中应该要注意的是函数声明的提升,也就是function foo1(){}会自动被提升到顶部,所以foo1()的调用是可以的.第一个输出1是毫无疑问的!那么第二个实际上被js引擎解析为: var a; foo();…
这篇随笔是对网上文章的整理吸收 1. javascript的作用域是函数,不是块 2. 在函数内部,javascript解释器会把var变量提升到当前域的最前面,但是函数体不会提升. 看下面例子: var v = "hello"; (function(){ console.log(v); // var v = "world"; })(); 输出值为 hello var v = "hello"; (function(){ console.log(v…
在JavaScript中有三种声明变量的方式:const var let const:用于声明常量.注意:定义的变量的时候,必须同时初始化,且其值之后不可以修改. var:最常用的声明变量关键字. 定义的变量的时候,若没有初始化,不报错,会输出undefined.其值之后可以修改.var可以用来声明全局变量,也可以声明局部变量,依据它们声明的位置: 全局变量:在函数外定义的变量:(注意:若没有使用关键字声明的变量,默认为全局变量.)作用域是整个代码文件. 局部变量:在函数内定义的变量.作用域是…