JS作用域理解(声明提升)】的更多相关文章

1.JS解析步骤: a.预解析 将变量声明提升: 将函数声明及函数内容提升,可以理解成原来位置的函数在解析代码时已经提到代码初始位置: 块内的变量声明和函数声明也会被提升,例如if语句 遇到重名,只留下一个: 如有重名变量和函数,留下函数: 如有两个重名函数,后一个函数覆盖前一个函数: firefox不能预解析块内定义的函数,出于兼容性考虑,定义函数,一般要放到最外面 (注意:变量提升的是声明,函数提升的是声明和内容) b.逐行解析代码 遇到表达式,可以修改预解析的变量值,例如变量赋值可以将函数…
function functions(flag) { if (flag) { function getValue() { return 'a'; } } else { function getValue() { return 'b'; } } return getValue(); } console.log(function functions(true)); 请问这段代码会输出什么呢. 答案将永远是:b. 解释一下为什么,因为在js是没有块级作用域的,又因为函数声明提升的原因,上面的这段代码变…
1.JS解析步骤: a.预解析 将变量声明提升: 将函数声明及函数内容提升,可以理解成原来位置的函数在解析代码时已经提到代码初始位置: 遇到重名,只留下一个: 如有重名变量和函数,留下函数: 如有两个重名函数,后一个函数覆盖前一个函数: firefox不能预解析块内定义的函数,出于兼容性考虑,定义函数,一般要放到最外面 (注意:变量提升的是声明,函数提升的是声明和内容) b.逐行解析代码 遇到表达式,可以修改预解析的变量值,例如变量赋值可以将函数声明替换掉: 2.如果有几个script代码部分,…
作用域 作用域可以理解为JS引擎执行代码的时候,查找变量的规则. 从确定变量访问范围的阶段的角度,可以分为2类,词法作用域和动态作用域.js是词法作用域. 从变量查找的范围的角度,可以分为3类,全局作用域.函数作用域和块级作用域. 词法作用域 词法作用域是在词法分析阶段就确定的作用域,变量的访问访问仅由声明时候的区域决定. 动态作用域则是在调用的而时候决定,它是基于调用栈的. var a = 2; function foo() { console.log( a ); } function bar…
你知道下面的JavaScript代码执行时会输出什么吗? var foo = 1; function bar() { if (!foo) { var foo = 10; } console.log(foo); } bar(); 答案是“10”,吃惊吗?那么下面的可能会真的让你大吃一惊: var a = 1; function b() { a = 10; return; function a() {} } b(); console.log(a); 答案是 “1”.为什么会这样呢,这就涉及到 JS…
作用域是JS中一个很基础但是很重要的概念,面试中也经常出现,本文会详细深入的讲解这个概念及其他相关的概念,包括声明提升,块级作用域,作用域链及作用域链延长等问题. 什么是作用域 第一个问题就是我们要弄清楚什么是作用域,这不是JS独有的概念,而是编程领域中通用的一个概念.我们以下面这个语句为例: let x = 1; 这一个简单的语句其实包含了几个基本的概念: 变量(variable):这里x就是一个变量,是用来指代一个值的符号. 值(value):就是具体的数据,可以是数字,字符串,对象等.这里…
一.变量作用域 说到这个概念,不有自主的想到this,scope 这两个关键字. JavaScript的this总是指向一个明确的对象,这个对象是在执行的时候动态绑定的.通俗的说就是谁调用我,我的this就是谁. 除去不常用的with和eval,具体的实际应用中,this的指向分为以下四种情况: ·作为对象的调用: ·作为普通函数的调用: ·构造器的调用: ·Function.propotype.call 和 Functio.propotype.apply 调用: 下面我们分别进行介绍. 1.作…
先看下面一段代码: 代码执行的结果是: 1st alert : a = 0 2nd alert : a = undefined 5th alert : a = 0 3rd alert : a = 3 4th alert : a = 2 疑问1:对于 2nd alert 而言,为什么 a 的值是 undefined ? 首先来看 JS 的执行环境和作用域. 执行环境(executing context)定义了变量或函数有权访问的其他数据.在 JS 中,有两种执行环境,一种是全局环境,也就是 Web…
Function declarations and variable declarations are always moved (“hoisted”) invisibly to the top of their containing scope by the JavaScript interpreter. example1 : var foo = 1; function bar() { if (!foo) { var foo = 10; } console.log(foo); } bar();…
作用域(Scoping) javascript作用域之所以迷惑,是因为它程序语法本身长的像C家族的语言.我对作用域的理解是只会对某个范围产生作用,而不会对外产生影响的封闭空间.在这样的一些空间里,外部不能访问内部变量,但内部可以访问外部变量. c语言的变量分为全局变量和局部变量,全局变量的作用范围是任何文件和函数访问(当然,对于非变量定义的其他c文件,需要使用extern关键字进行申明,使用static关键字也可以将作用范围限定在当前文件中),局部变量的作用范围就是从申明到最近的大括号涵盖的块级…