javascript中变量以及函数的提升,在我们平时的项目中其实还是挺常用的,尤其是大型项目中,不知不觉就会顺手添加一些变量,而有时候自己的不小心就会酿成一些不必要错误,趁有时间整理一下自己对于js中变量及函数提升的理解. 首先,看一个题目: console.log(a); // undefined var a = 1; console.log(a); console.log(b()); console.log(c) //报错 let c = 4; console.log(d()) // 报错…
之前接触了一些javascript局部变量命名提升的问题但是一直没有总结今天特地好好总结一下 变量提升 一个变量的作用域是程序源代码中定义的这个变量的区域.全局变量拥有全局作用域,在javascript代码中任何地方都有的定义.但是函数中声明的变量只在函数体内有定义,它是局部变量并且函数体内的的局部变量的优先级是高于同名全局变量,所以全局变量会被局部变量顶替. var scope = "global"; //全局变量 function checkScope(){ var scope =…
变量的作用域在函数之外声明的变量,叫做全局变量,因为它可被当前文档中的任何其他代码所访问.在函数内部声明的变量,叫做局部变量,因为它只能在当前函数的内部访问. ECMAScript 6 之前的 JavaScript 没有 语句块作用域:相反,语句块中声明的变量将成为语句块所在函数(或全局作用域)的局部变量.例如,如下的代码将在控制台输出 5,因为 x 的作用域是声明了 x 的那个函数(或全局范围),而不是 if 语句块. if (true) {var x = 5;}console.log(x);…
暂时性的死区(Temporal Dead Zone),简写为 TDZ: 只要块级作用域里存在let命令,它所声明的变量就绑定这个区域,不在受外部的影响 let 和 const 声明的变量不会被提升到作用域顶部,如果在声明之前访问这些变量,会导致报错: console.log(typeof value); // Uncaught ReferenceError: value is not defined let value = 1; 复制代码这是因为 JavaScript 引擎在扫描代码发现变量声明…
在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分. JS的解析过程分为两个阶段:预编译期(预处理)与执行期. 预编译期JS会对代码块中的所有声明的变量和函数进行处理(类似与C语言的编译),但需要注意的是此时处理函数的只是声明式函数,而且变量也只是进行了声明但未进行初始化以及赋值. console.log(a);//undefined if (!("a" in wind…
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…
在ECMAScript5中没有块级作用域一说,只有函数作用域和全局作用域,在其中声明的变量和函数和其他语言的展现形式不同,在某些情况下不一定需要先定义后使用,函数和变量的使用可以在其声明之前,这到底是怎么回事呢?让我们一起揭开变量声明提前的神秘面纱!!! 一.变量声明提升 var a = 10; function test() { a = 100; alert(a); alert(this.a); var a; alert(a); } test(); 这题考的也是变量声明提升,函数作用域中提前使…
先来两个问题 很多时候,在直觉上,我们都会认为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…
函数声明和变量声明总是会被解释器悄悄地被“提升”到方法体的最顶部 请注意,变量赋值并没有被提升,只是声明被提升了. 函数的声明比变量的声明具有高的优先级. 下面的程序是什么结果? var foo = 1; function bar() { if (!foo) { var foo = 10; } alert(foo); } bar(); 结果是10: 那么下面这个呢? var a = 1; function b() { a = 10; return; function a() {} } b();…
原文:http://zha-zi.iteye.com/blog/2037026 下面的程序是什么结果? var foo = 1; function bar() { if (!foo) { var foo = 10; } alert(foo); } bar(); 结果是10: 那么下面这个呢? var a = 1; function b() { a = 10; return; function a() {} } b(); alert(a); 结果是1,因为函数的提升要比变量的提升有更高的优先级,所…
参考网址:http://www.codesec.net/view/178491.html 先简单理解下作用域的概念,方便对变量与函数提升的概念的理解 function foo() { var x = 1; if (x) { var x = 2; } console.log(x); } foo(); 结果为2,可见js中并没有块级作用域的概念可以使用下面的方法创造自己的作用域,这样不会干扰到外部变量 function foo() { var x = 1; if (x) { (function()…
js 变量.函数提升 先简单理解下作用域的概念,方便对变量与函数提升的概念的理解 function foo() { var x = 1; if (x) { var x = 2; } console.log(x); } foo();// 2 结果为2,可见js中并没有块级作用域的概念 能够使用以下的方法创造自己的作用域.这样不会干扰到外部变量 function foo() { var x = 1; if (x) { (function() { var x = 2; }()); } console.…
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()函数时由于变量…
为什么会出现暂时性死区? 先来看看 ES6 标准中对 let/const 声明中的解释 第13章,有如下一段文字:The variables are created when their containing Lexical Environment is instantiated but may not be accessed inany way until the variable’s LexicalBinding is evaluated. 当然这段话我看完也很懵,查阅了一些帖子,翻译成人话…